Spring嵌套事務


Spring 事務傳播屬性如下

  •     PROPAGATION_REQUIRED--支持當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。
  •   PROPAGATION_SUPPORTS--支持當前事務,如果當前沒有事務,就以非事務方式執行。
  •   PROPAGATION_MANDATORY--支持當前事務,如果當前沒有事務,就拋出異常。
  •   PROPAGATION_REQUIRES_NEW--新建事務,如果當前存在事務,把當前事務掛起。
  •   PROPAGATION_NOT_SUPPORTED--以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
  •     PROPAGATION_NEVER--以非事務方式執行,如果當前存在事務,則拋出異常。
  •     PROPAGATION_NESTED--

拿以下代碼分析Spring 嵌套事務

    ServiceA {  
             
         void methodA() {  
             ServiceB.methodB();  
         }  
        
    }  
        
    ServiceB {  
             
         void methodB() {  
         }  
             
    }  

案例1,ServiceB.methodB的事務級別定義為PROPAGATION_REQUIRED,

  1、如果ServiceA.methodA已經起了事務,這時調用ServiceB.methodB,會共用同一個事務,如果出現異常,ServiceA.methodA和ServiceB.methodB作為一個整體都將一起回滾。
  2、如果ServiceA.methodA沒有事務,ServiceB.methodB就會為自己分配一個事務。ServiceA.methodA中是不受事務控制的。如果出現異常,ServiceB.methodB不會引起ServiceA.methodA的回滾。
 

案例2,ServiceA.methodA的事務級別PROPAGATION_REQUIRED,ServiceB.methodB的事務級別PROPAGATION_REQUIRES_NEW,

調用ServiceB.methodB,ServiceA.methodA所在的事務就會掛起,ServiceB.methodB會起一個新的事務。

1、如果ServiceB.methodB已經提交,那么ServiceA.methodA失敗回滾,ServiceB.methodB是不會回滾的
2、如果ServiceB.methodB失敗回滾,如果他拋出的異常被ServiceA.methodA的try..catch捕獲並處理,ServiceA.methodA事務仍然可能提交;如果他拋出的異常未被ServiceA.methodA捕獲處理,ServiceA.methodA事務將回滾。
 
案例3,ServiceA.methodA的事務級別為PROPAGATION_REQUIRED,ServiceB.methodB的事務級別為PROPAGATION_NESTED,
調用ServiceB.methodB的時候,ServiceA.methodA所在的事務就會掛起,ServiceB.methodB會起一個新的子事務並設置savepoint
1、如果ServiceB.methodB已經提交,那么ServiceA.methodA失敗回滾,ServiceB.methodB也將回滾。
2、如果ServiceB.methodB失敗回滾,如果他拋出的異常被ServiceA.methodA的try..catch捕獲並處理,ServiceA.methodA事務仍然可能提交;如果他拋出的異常未被ServiceA.methodA捕獲處理,ServiceA.methodA事務將回滾。
 


免責聲明!

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



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