事務的七種傳播方式


所謂事務的傳播行為是指,如果在開始當前事務之前,一個事務上下文已經存在,此時有若干選項可以指定一個事務性方法的執行行為。

當事務存在嵌套關系時,子事務與父事務的關系以及回滾的影響范圍(傳播-回滾的傳播)

示例定義:

T1{
 
  O(A);
 
  T2{
    O(B);
 
    O(C); 
  };
 
  O(D); 
};

各種傳播性的關系

PROPAGATION_REQUIRED=0:

如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。
  • 無父事務時:子事務作為獨立事務執行
  • 有父事務時:子事務中的操作串入父事務中執行,並且一起提交,一個操作失敗全部回滾

總結:如果有父事務就和父事務同進退,如果沒有就新建事務

PROPAGATION_SUPPORTS=1:

如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續運行。
  • 無父事務時:以非事務方式執行
  • 有父事務時:加入父事務執行,等同於PROPAGATION_REQUIRED

總結:如果有父事務就和父事務同進退,如果沒有就按非事務執行

PROPAGATION_MANDATORY=2:

如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。
  • 無父事務時:拋出異常
  • 有父事務時:加入父事務執行,等同於PROPAGATION_REQUIRED

總結:如果有父事務就和父事務同進退,如果沒有就拋出異常

PROPAGATION_REQUIRES_NEW=3:

創建一個新的事務,如果當前存在事務,則把當前事務掛起。
掛起(Suspend):通知 TransactionManager不再檢查某事務的狀態,直到Resume

AbstractPlatformTransactionManager. handleExistingTransaction()

  • 無父事務時:子事務新建事務作為獨立事務執行
  • 有父事務時:子事務新建事務作為獨立事務執行,獨立提交;
T1{
 
  O(A);
 
  T2{
    O(B);
 
    O(C); 
  };
 
  O(D); 
};

如此示例:

  • 子事務T2不受父事務T1回滾的影響,但仍作為T1的子邏輯,
  • O(D)失敗,O(A)回滾,T2中的事務不回滾;
  • T2失敗回滾,T1捕獲異常后,可以選擇提交或回滾,未捕獲異常,同T2一起回滾。

總結:新建事務不管有沒有父事務,互不影響(父事務通過捕獲異常可以選擇是否回滾)

NOT_SUPPORTED=4:

以非事務方式運行,如果當前存在事務,則把當前事務掛起。
  • 無父事務時:以非事務方式執行
  • 有父事務時:掛起父事務,自己按照無事務方式運行
  子事務自身無回滾,出現異常若向上拋,可能導致父事務回滾
  父事務回滾時,不會影響子事務。

總結:不管有沒有父事務都按非事務運行,如果出現異常,可能導致父事務回滾

NEVER=5:

以非事務方式運行,如果當前存在事務,則拋出異常。
  • 無父事務時:以非事務方式執行
  • 有父事務時:拋出異常(若不處理會導致父事務回滾)

總結:按非事務運行,如果有父事務存在就拋出異常,如果父事務不處理就導致父事務回滾

NESTED=6:

如果當前存在事務,則創建一個事務作為當前事務的嵌套事務來運行
  • 無父事務時:創建獨立事務,等同於PROPAGATION_REQUIRED
  • 有父事務時:嵌套在父事務之內
子事務依賴父事務:子事務於父事務提交時提交;父事務回滾,子事務也回滾。
Savepoint:子事務回滾時,父事務不回滾

總結:聽爹的,爹干啥兒干啥,但是爹不聽兒的



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM