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