Spring的事務隔離級別/事務傳播行爲

Spring的五種事務隔離級別

  1. 默認:默認使用數據庫的隔離級別
  2. 讀未提交
  3. 讀提交
  4. 可重複讀
  5. 串行化

Spring的七種事務傳播行爲

1. propagation_required:

表示當前方法必須運行在事務中。如果當前事務存在,方法將會在該事務中運行。 否則會啓動一個新的事務。
在這裏插入圖片描述

2. propagation_supports:

表示當前方法不需要上下文,如果事務存在當前事務的話,那麼該方法會在這個事務中執行。

也就是說:如果存在一個事務,支持當前事務。如果沒有事務,則非事務的執行。

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
 methodB();
// do something
}
 
// 事務屬性爲SUPPORTS
@Transactional(propagation = Propagation.SUPPORTS)
public void methodB() {
    // do something
}
  • 當單獨調用methodB時,methodB方法是非事務的執行的。
  • 當調用methdA時,methodB則加入了methodA的事務中,事務地執行。

3. propagation_mandatory:

如果已經存在一個事務,則支持當前事務。如果沒有一個活動的事務,就拋出異常。

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
 methodB();
// do something
}
 
// 事務屬性爲MANDATORY
@Transactional(propagation = Propagation.MANDATORY)
public void methodB() {
    // do something
}
  • 當單獨調用methodB時,因爲當前沒有一個活動的事務,則會拋出異常throw new IllegalTransactionStateException(“Transaction propagation ‘mandatory’ but no existing transaction found”);

  • 當調用methodA時,methodB則加入到methodA的事務中,事務地執行。

4. propagation_requires_new

在這裏插入圖片描述
如果當前方法在一個事務中,那麼創建一個新的事務,與外層事務無關 ( 外層事務回滾也不會回滾這個事務 ), 例如,上面單獨執行的方法B,就單獨創建了一個新事務,和調用者事務A無關

5. propagation_not_supported

在這裏插入圖片描述
在一段事務中,如果某一個函數不希望其支持事務的話,那麼就給這個函數使用propagation_not_supported就ok了。

6. PROPAGATION_NEVER

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

7. PROPAGATION_NESTED

在這裏插入圖片描述
如果沒有活動事務, 則獨創一個事務執行。

如果在一個活動事務裏的話,其實和propagation.required_new類似都是創建一個新的事務,但有些區別就是:

required_new 不存在嵌套關係,即外層事務的回滾不會對內層事務回滾!

而使用propagation_nested時,外層事務的回滾可以引起內層事務的回滾。(但內層事務的異常並不會導致外層事務的回滾,它是一個真正的內部嵌套的事務)。

轉載自 看完就明白_spring事務的7種傳播行爲

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章