1. 程式人生 > 其它 >mysql 事務的傳播機制

mysql 事務的傳播機制

事務傳播機制

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:子事務回滾時,父事務不回滾