spring學習(三) ———— spring事務操作
前面一篇博文講解了什麼是AOP。學會了寫AOP的實現,但是並沒有實際運用起來,這一篇博文就算是對AOP技術應用的進階把,重點是事務的處理。
--wh
一、jdbcTemplate
什麼是JdbcTemplate?
spring提供用於操作資料庫模版,類似Dbutils,通俗點講,我們操作資料庫,spring也會幫我們提供一個操作資料庫的工具供我們使用,而不用我們自己手動編寫連線資料庫,獲取結果集等等操作,這個工具就是JdbcTemplate。跟Dbutils一樣,想要使用JdbcTemplate,就必須給他配置資料來源。
第一步:導包
第二步:配置資料來源,配置模版,給UserDao配置模版
使用dbcp充當資料來源
使用c3p0充當資料來源
第三步:UserDao中使用JdbcTemplate
但是spring為了讓我們更方便,不用每次都寫set方法和JdbcTemplate屬性,給我們提供了一個類JdbcDaoSupport,我們只需要繼承他,就可以直接獲得jdbcTemplate了,因為JdbcDaoSupport中幫我們寫了set方法
第四步:使用JdbcTemplate API操作資料庫
update 進行 增刪改操作
queryForObject 查詢一個
query 查詢所有
queryForInt 查詢一個整形(分頁)
第五步,測試 成功插入資料,其他的就不測了。
提升:使用properties
將連線資料的具體引數配合到properties檔案,由spring載入properties,並在spring配置檔案中使用
二、事務的回顧
如果一點都不清楚,看這篇博文,詳細講解了事務http://www.cnblogs.com/whgk/p/6182742.html
事務:一組業務操作,要麼全部成功,要麼全部失敗
特性:ACID
A:原子性,是說事務是一個整體,要麼全部成功,要麼全部失敗
C:一致性,資料完整,你轉100給我,你減100,我要增加100
I:隔離性,併發(多個事務)
D:永續性,已經提交的事務,就已經儲存到資料庫中,不能在改變了
隔離問題:
髒讀:讀取到未提交的資料
不可重複讀:讀取到已經提交的資料(update)
虛度(幻讀):讀取到已經提交的資料(insert)
解決隔離問題
讀未提交:存在三個問題。
讀已提交:存在兩個問題,解決髒讀問題(Oracle預設級別)
可重複讀:存在一個問題,解決髒讀,不可重複讀問題(Mysql預設級別)
序列化:解決所有問題。
而我們普通的程式要想使用事務的話,通過連線Connection來開啟事務和關閉事務或者回滾,
三、spring如何進行事務的管理的理論分析
PlatformTransactionManager:事務平臺管理器。
spring管理事務時,必須使用平臺事務管理器,它是一個介面,相當於定義一個spring使用事務的規範,也就是如果你想用spring來幫你管理事務,那麼就必須遵循這個規範,spring也幫我們實現了一些常用的技術所需要的管理器,比如,jdbc有jdbc管理器,hibernate有hibernate管理器,他們都是實現spring中的PlatformTransactionManager介面的。
jdbc事務管理器:DataSourceTransactionManager
hibernate事務管理器:HibernateTransactionManager
PlatformTransactionManager是一個介面,那我們看它定義了哪些方法供我們使用的。
TransactionStatus getTransaction(TransactionDefinition);
獲取事務,引數TransactionDefinition(事務詳情),該引數是需要我們配置的,通過我們配置的內容才能知道事務如何去處理。這個下面會詳解
commit(TransactionStatus);
根據狀態來提交事務的操作
rollback(TransactionStatus);
根據狀態來回滾事務的操作
TransactionStatus
spring使用管理器,通過狀態對事務進行管理(操作),我們不必關心這個,因為這是spring內部操作的事情,但是我們可以瞭解一下有哪些方法
TransactionDefinition
spring管理器必須通過"事務詳情"的設定,獲取相應的事務,從而進行事務管理。這裡這個很重要,我們需要配置這個
設定4個隔離級別就不用說了把,跟上面我們說的是一樣的。解決隔離問題的四種級別。
傳播行為:一個業務A,一個業務B,AB如何共享事務,不同傳播行為共享方案不同。
什麼意思呢?比如業務A為銀行轉賬的業務。 業務B為轉完賬發簡訊的業務,平常我們是轉完錢,那麼我們就需要收到簡訊說我們的賬戶上被轉走多少錢,而收錢的那一方則需要收到簡訊說賬戶被轉進多少錢,那麼這兩個業務是使用同一個事務呢?還是分別使用不同的事務,也就是如果是使用同一個事務的話,我們轉錢成功了代表業務A成功了,但是業務B傳送簡訊時出現問題,則說明該事務失敗,那麼剛才轉的錢就算不成功,需要回滾,但是實際生活中,是不能這樣的,轉錢成功了,簡訊沒傳送成功,那麼簡訊在重新發送一次即可。不需要讓業務A重新在操作一遍。這就是業務A和業務B共享事務的解決方法,讓他們兩個使用各自的事務。而傳播行為就是提供這樣的共享方案的屬性。
傳播行為方案
1.PROPAGATION_REQUIRED ,required ,必須使用事務 (預設值)
A 如果使用事務,B 使用同一個事務。(支援當前事務)
A 如果沒有事務,B將建立一個新事務。
2.PROPAGATION_SUPPORTS,supports ,支援事務
A 如果使用事務,B 使用同一個事務。(支援當前事務)
A 如果沒有事務,B 將以非事務執行。
3.PROPAGATION_MANDATORY,mandatory 強制
A 如果使用事務,B 使用同一個事務。(支援當前事務)
A 如果沒有事務,B 拋異常
4.PROPAGATION_REQUIRES_NEW , requires_new ,必須是新事務
A 如果使用事務,B將A的事務掛起,再建立新的。
A 如果沒有事務,B將建立一個新事務
5.PROPAGATION_NOT_SUPPORTED ,not_supported 不支援事務
A 如果使用事務,B將A的事務掛起,以非事務執行
A 如果沒有事務,B 以非事務執行
6.PROPAGATION_NEVER,never 從不使用
A 如果使用事務,B 拋異常
A 如果沒有事務,B 以非事務執行
7.PROPAGATION_NESTED nested 巢狀
A 如果使用事務,B將採用巢狀事務。
巢狀事務底層使用Savepoint 設定儲存點,將一個事務,相當於拆分多個。比如業務A為AB兩個曹祖,業務B為CD兩個操作,業務AB使用同一個事務,在AB (POINT) CD,當業務B失敗時,回滾到POINT處,從而業務A還是成功的,就是保持點的操作。
底層使用巢狀try方式
掌握:PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW、PROPAGATION_NESTED
總結:
spring事務程式設計的步驟
1、確定管理器
2、必須配置事務詳情(是否只讀,隔離級別,傳播行為等)
配置好了事務詳情,也確定了使用哪個管理器,那麼spring就知道如何對事務進行怎樣的處理了。
四、spring使用AOP技術來進行事務操作(基於xml)
上面我們知道了spring使用事務需要哪些東西,但是單純的使用上面這些編寫事務,那我們對每個需要使用事務的方法都需要寫程式碼,豈不是累死,但是結合前面學習的AOP思想,就簡單很多了。
重點看配置
重點看47到59行的程式碼,配置事務管理器和事務詳情,然後通過aop將我們的事務應用到指定的切入點上去,使用的是表示式。指定一個範圍。其中,事務詳情和事務管理器的結合就相當於通知(加強的方法),所以菜在通知引用上可以寫上exAdvice。這點必須想清楚。也就是我們都不需要自己手動寫什麼開啟事務等程式碼,spring全幫我們寫好了,我們只需要配置一下事務詳情即可。
需要注意一點,因為使用的是spring內建的aop,沒有使用AspectJ框架,所以如果沒有使用介面,那麼就需要寫56行這行程式碼,如果使用了介面,那麼就不需要寫。需要通知spring使用cjlib代理
事務詳情的配置
這樣設定的話,就可以對不同的方法進行不同的事務處理了,很方便。比如add*,意思是add開頭的方法,就使用傳播行為為REQUIRED的事務進行處理,而find*,find開頭的方法只能讀,並且傳播行為為REQUIRED。
五、spring使用AOP技術來進行事務操作(基於註解)
超級簡單。三步
1、宣告事務管理器
2、將事務管理器交予spring
前兩步是在xml中寫的
3、在目標類或方法上 使用註解即可 @Transactional
使用@Transactional(編寫事務詳情)
六、總結
上面所寫的aop的是使用spring預設的aop,並沒有使用AspectJ框架,要區分清楚。並且今天這篇講的是使用aop對事務進行管理。其實也就是通過aop對指定的方法進行加強,而加強的內容就是事務的內容,而事務的內容也是由spring幫我們做的,也就是通知也是spring幫我們寫的,我們只需要通過配置事務管理器和事務詳情即可。而前面一篇,所有的通知都是我們自己手動編寫的,為的是體驗aop的那種思想,這是不一樣的。所以不要把自己給搞混了。
第一篇博文:IOC(反轉控制),在配置檔案中配置bean,然後spring幫我們建立物件。預設就建立一個物件。singgton
第二篇博文:AOP(面向切面程式設計),理解了AOP思想,和spring如何使用AOP技術,底層使用jdk和cglib進行代理,有介面使用jdk,沒有介面可以使用cglib。掌握了spring內建的aop技術,還有一個AspectJ框架。要知道這兩個是如何配置的,會使用AspectJ的註解和xml方式
第三篇博文(本篇):AOP的應用(spring事務處理),spring幫我們將事務都已經寫好了,我們只需要通過配置事務管理器,和事務詳情(兩者相當於通知了),然後使用spring內建的aop技術,將其在指定的方法上使用事務(相當於增強指定的方法),xml配置和註解兩種方式。
第四篇博文:整合SSH框架