1. 程式人生 > >Spring嵌套事務

Spring嵌套事務

otto AS CM catch spring 事務 void OS spa lan

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事務將回滾。

Spring嵌套事務