spring 事務隔離級別和傳播屬性

一. TransactionDefinition接口中定義了五個不同的事務隔離級別

 

1. ISOLATION_DEFAULT 這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別.另外四個與JDBC的隔離級別相對應


2. ISOLATION_READ_UNCOMMITTED 這是事務最低的隔離級別,它充許別外一個事務可以看到這個事務未提交的數據。這種隔離級別會產生髒讀,不可重複讀和幻像讀。(未提交讀 UR)

 

3. ISOLATION_READ_COMMITTED  保證一個事務修改的數據提交後才能被另外一個事務讀取。另外一個事務不能讀取該事務未提交的數據。這種事務隔離級別可以避免髒讀出現,但是可能會出現不可重複讀和幻像讀。 (遊標穩定性 CS

4. ISOLATION_REPEATABLE_READ  這種事務隔離級別可以防止髒讀,不可重複讀。但是可能出現幻像讀。它除了保證一個事務不能讀取另一個事務未提交的數據外,還保證了避免下面的情況產生(不可重複讀)。(讀穩定性 RS)

 

5. ISOLATION_SERIALIZABLE 這是花費最高代價但是最可靠的事務隔離級別。事務被處理爲順序執行。除了防止髒讀,不可重複讀外,還避免了幻像讀。(不可重複讀 RR)

 

隔離級別

存取未落實數據

重複讀

幻想讀

讀穩定性 RS

不可能

不可能

不可能

讀穩定性 RS

不可能

不可能

可能

遊標穩定性 CS

不可能

可能

可能

未提交讀 UR

可能

可能

可能

DEFAULT

數據庫默認的事務隔離級別

 

 

 

二. 在TransactionDefinition接口中定義了七個事務傳播行爲

 

PROPAGATION_REQUIRED = 0 如果存在一個事務,則支持當前事務。如果沒有事務則開啓一個新的事務。

 

PROPAGATION_REQUIRES_NEW = 3 總是開啓一個新的事務。如果一個事務已經存在,則將這個存在的事務掛起。

 

PROPAGATION_SUPPORTS = 1  如果存在一個事務,支持當前事務。如果沒有事務,則非事務的執行。但是對於事務同步的事務管理器,PROPAGATION_SUPPORTS與不使用事務有少許不同。

 

PROPAGATION_NOT_SUPPORTED = 4  總是非事務地執行,並掛起任何存在的事務。

 

PROPAGATION_MANDATORY = 2 -- 支持當前事務,如果當前沒有事務,就拋出異常。

 

PROPAGATION_NEVER = 5  總是非事務地執行,如果存在一個活動事務,則拋出異常

 

PROPAGATION_NESTED = 6 如果一個活動的事務存在,則運行在一個嵌套的事務中. 如果沒有活動事務, 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執行

 

PROPAGATION_NESTED 與PROPAGATION_REQUIRES_NEW的區別:它們非常類似,都像一個嵌套事務,如果不存在一個活動的事務,都會開啓一個新的事務。使用PROPAGATION_REQUIRES_NEW時,內層事務與外層事務就像兩個獨立的事務一樣,一旦內層事務進行了提交後,外層事務不能對其進行回滾。兩個事務互不影響。兩個事務不是一個真正的嵌套事務。同時它需要JTA事務管理器的支持。
使用PROPAGATION_NESTED時,外層事務的回滾可以引起內層事務的回滾。而內層事務的異常並不會導致外層事務的回滾,它是一個真正的嵌套事務。DataSourceTransactionManager使用savepoint支持PROPAGATION_NESTED時,需要JDBC 3.0以上驅動及1.4以上的JDK版本支持。其它的JTA TrasactionManager實現可能有不同的支持方式。

 

PROPAGATION_REQUIRES_NEW 完全是一個新的事務, PROPAGATION_NESTED 則是外部事務的子事務

PROPAGATION_REQUIRED應該是我們首先的事務傳播行爲。它能夠滿足我們大多數的事務需求。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章