spring 事務基礎

Spring中的聲明式事務是基於AOP實現的,而Spring的AOP是以方法爲單位的,所以Spring的事務屬性就對事務應用到方法上的策略描述,這些屬性爲:傳播行爲,隔離級別,只讀和超時屬性。

 

使用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

Spring對事務的控制的API全部位於org.springframework.transaction包下面,其中出去異常定義的類外,僅有四個接口,這四個接口是Spring操作事務的核心,下面一一介紹:
 
org.springframework.transaction
 
Interfaces 
        PlatformTransactionManager
        SavepointManager
        TransactionDefinition
        TransactionStatus

1、PlatformTransactionManager
 
是一個事務管理平臺,該接口有許多具體的事務實現類,例如DataSourceTransactionManager, HibernateTransactionManager, JdoTransactionManager, JmsTransactionManager, JpaTransactionManager, JtaTransactionManager, TopLinkTransactionManager, WebLogicJtaTransactionManager 等等,通過實現此接口,Spring可以管理任何實現了這些接口的事務。開發人員也可以使用統一的編程模型來控制管理事務。
 
2、TransactionDefinition
 
這個接口的作用就是定義事務的名稱、隔離級別、傳播行爲、超時時間長短、只讀屬性等。
 
字段摘要:
(因爲是接口,裏面都是int常量,即public static final類型的,很多,我就只寫常量的名字和含義)
這些接口分兩組,分別是事務隔離級別和事務傳播行爲。
 
//事務隔離級別(數據庫級別的知識)
TransactionDefinition.ISOLATION_DEFAULT
使用底層數據庫默認隔離級別。
 
TransactionDefinition.ISOLATION_READ_UNCOMMITTED 讀未提交
最低隔離等級,允許事務讀取其他並行的事務還沒有提交的數據,會發生髒讀(dirty reads)、不可重複讀(non-repeatable reads)、幻讀(phantom read)等問題。
 
TransactionDefinition.ISOLATION_READ_COMMITTED 讀已提交
允許事務讀取其他並行的事務已經提交的數據,可以防止髒讀問題。
 
TransactionDefinition.ISOLATION_REPEATABLE_READ 可重複讀
保證了一個事務不會修改已經由另一個事務讀取但未提交(回滾)的數據。
 
TransactionDefinition.ISOLATION_SERIALIZABLE 可串行化
所有事務都嚴格隔離,各個事務順序執行。很容易發生死鎖。
 
//事務傳播行爲
TransactionDefinition.PROPAGATION_REQUIRED
支持現有的事務,如果沒有則新建一個事務。
 
TransactionDefinition.PROPAGATION_SUPPORTS
支持現有的事務,如果沒有則以非事務狀態運行。
 
TransactionDefinition.PROPAGATION_MANDATORY
支持現有事務,如果沒有則拋出異常。
 
TransactionDefinition.PROPAGATION_REQUIRES_NEW
總是發起一個新事務。如果當前已存在一個事務,則將其掛起。
 
TransactionDefinition.PROPAGATION_NOT_SUPPORTED
不支持事務,總是以非事務狀態運行,如果當前存在一個事務,則將其掛起。
 
TransactionDefinition.PROPAGATION_NEVER
不支持事務,總是以非事務狀態運行,如果當前存在一個事務,則拋出異常。
 
TransactionDefinition.PROPAGATION_NESTED
如果石阡已經存在一個事務,則以嵌套事務的方式運行,如果當前沒有事務,則創建一個新事務。
 
3、TransactionStatus
 
這個接口的作用就是獲取事務的狀態(回滾點、是否完成、是否新事物、是否回滾)屬性,還可以進行事務rollback-only的設置。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章