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


免責聲明!

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



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