所謂事務的傳播行為是指,如果在開始當前事務之前,一個事務上下文已經存在,此時有若干選項可以指定一個事務性方法的執行行為。
當事務存在嵌套關系時,子事務與父事務的關系以及回滾的影響范圍(傳播-回滾的傳播)
示例定義:
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:子事務回滾時,父事務不回滾
總結:聽爹的,爹干啥兒干啥,但是爹不聽兒的