mysql 事務的傳播機制
1.PROPAGATION_REQUIRED=0:
如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。
無父事務時:子事務作為獨立事務執行
有父事務時:子事務中的操作串入父事務中執行,並且一起提交,一個操作失敗全部回滾
2.PROPAGATION_SUPPORTS=1:
如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續運行。
無父事務時:以非事務方式執行
有父事務時:加入父事務執行,等同於PROPAGATION_REQUIRED
3.PROPAGATION_MANDATORY=2:
如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。
無父事務時:拋出異常
有父事務時:加入父事務執行,等同於PROPAGATION_REQUIRED
4.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一起回滾。
5.NOT_SUPPORTED=4:
以非事務方式運行,如果當前存在事務,則把當前事務掛起。
無父事務時:以非事務方式執行
有父事務時:掛起父事務,自己按照無事務方式運行
子事務自身無回滾,出現異常若向上拋,可能導致父事務回滾
父事務回滾時,不會影響子事務。
6.NEVER=5:
以非事務方式運行,如果當前存在事務,則拋出異常。
無父事務時:以非事務方式執行
有父事務時:拋出異常(若不處理會導致父事務回滾)
7.NESTED=6:
如果當前存在事務,則創建一個事務作為當前事務的嵌套事務來運行
無父事務時:創建獨立事務,等同於PROPAGATION_REQUIRED
有父事務時:嵌套在父事務之內
子事務依賴父事務:子事務於父事務提交時提交;父事務回滾,子事務也回滾。
Savepoint:子事務回滾時,父事務不回滾
