Spring中的聲明式事務是基於AOP實現的,而Spring的AOP是以方法爲單位的,所以Spring的事務屬性就對事務應用到方法上的策略描述,這些屬性爲:傳播行爲,隔離級別,只讀和超時屬性。
1、從Spring容器中獲取PlatformTransactionManager實例。
2、定義TransactionDefinition並設置好事務的隔離級別和傳播方式。
3、通過PlatformTransactionManager.getTransaction()開始一個事務,並獲得TransactionStatus對象。
4、運行需要在事務環境下執行的代碼並捕獲異常。
5、如果有異常發生,將TransactionStatus設置爲setRollbackOnly(),表示要回滾事務。
6、調用PlatformTransactionManager.commit(TransactionStatus)方法提交事務,Spring根據TransactionStatus的狀態決定如何提交事務。如果TransactionStatus設置爲setRollbackOnly(),則回滾事務,否則提交
Spring的事務管理器有5個,都實現了PlatformTransactionManager接口,如下所示:
DataSourceTransactionManager JDBC事務管理器
HibernateTransactionManager Hibernate事務管理器
JdoTransactionManager JDO事務管理器
JtaTransactionManager JTA事務管理器
PersistenceBrokerTransactionManager Apache的OJB事務管理器
事務的ACID特性
事務使用ACID特性來衡量事務的質量。介紹如下:
1,原子性
事務必須是原子的,在事務結束的時候,事務中的所有任務必須全部成功完成,否則全部失敗,事務回滾到事務開始之間的狀態。
2,一致性
事務必須保證和數據庫的一致性,即數據庫中的所有數據和現實保持一致。如果事務失敗數據必須返回到事務執行之前的狀態,反之修改數據和現實的同步。
3,隔離性
隔離性是事務與事務之間的屏障,每個事務必須與其他事務的執行結果隔離開,直到該事務執行完畢,它保證了事務的訪問的任何數據不會受其他事務執行結果的影響。
4,持久性
如果事務成功執行,無論系統發生任何情況,事務的持久性都必須保證事務的執行結果是永久的。
事務之間的缺陷
在事務處理中有違返ACID特性的3個問題:髒讀取,不可重複讀和幻讀行。如果存在多個併發事務在運行,而這種事務操作了同一個數據來完成它們的任務,就會導致3個問題的存生。要解決它們,就必須在事務之間定義合適的隔離級別。
爲保證事務的完整性,必須解決事務之間可能存在的3個問題。
(1)髒讀取
一個事務讀取了另一個未提交的並行事務寫的數據。
當一個事務讀取了另一個事務尚未提交的更新,就叫髒讀取。在另一個事務回滾的情況下,當前事務所讀取的另一個事務的數據就是無效的。
(2)不可重複讀取
一個事務重新讀取前面讀取過的數據, 發現該數據已經被另一個已提交的事務修改過.
在一個事務中執行多次同樣的查詢操作,但每次查詢的結果都不一樣,就叫做不可重複讀取,通常這種情況是由於數據在二次查詢之間被另一個併發的事務所修改。
(3)幻影行
一個事務重新執行一個查詢,返回一套符合查詢條件的行, 發現這些行因爲其他最近提交的事務而發生了改變
這是對事務危害最小的一個問候,它類似不可重複讀取,也是一個事務的更新結果影響到另一個事務問題。但是它不僅影響另一個事務查詢結果,而且還會使查詢語句返回一些不同的行錄行。
這3個問題危害程度依次爲:髒讀取最大-->不可重複讀取-->幻影行最小。
認識Spring的事務包的API