Spring嵌套事務
阿新 • • 發佈:2018-06-26
otto AS CM catch spring 事務 void OS spa lan
案例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 事務傳播屬性如下
- 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,
案例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嵌套事務