##PROPAGATION_REQUIRED ###簡介spring
加入當前已有事務;只有當前沒有事務才啓一個新的事務
###設計設計
類ServiceA,方法methodA,事務級別定義爲PROPAGATION_REQUIRED 類ServiceB,方法methodB,事務級別定義爲PROPAGATION_REQUIRED
###案例code
先調用ServiceA.methodA,發現沒有運行在事務中,分配一個新事務。再調用ServiceB.methodB(這個要寫在ServiceA.methodA內部),發現已經運行在ServiceA.methodA的事務內部,就再也不啓新的事務,而使用ServiceA.methodA事務。
###總結事務
在ServiceA.methodA或者在ServiceB.methodB內的任何地方出現異常,2個方法內部的操做,都會被事務回滾。
##PROPAGATION_SUPPORTS ###簡介方法
若是當前在事務中,即以事務的形式運行,若是當前不在一個事務中,那麼就以非事務的形式運行
###設計總結
類ServiceA,方法methodA,事務級別定義爲PROPAGATION_REQUIRED 類ServiceB,方法methodB,事務級別定義爲PROPAGATION_SUPPORTS
###案例1數據
先調用ServiceA.methodA,發現沒有運行在事務中,分配一個新事務。再調用ServiceB.methodB(這個要寫在ServiceA.methodA內部),發現已經運行在ServiceA.methodA的事務內部,繼續使用事務運行。
###案例2異常
直接調用ServiceB.methodB,發現沒有運行在事務中,使用非事務運行。
##PROPAGATION_MANDATORY ###簡介poi
支持當前事務,若是當前沒有事務,就拋出異常
###設計vi
類ServiceA,方法methodA,事務級別定義爲PROPAGATION_NOT_SUPPORTED 類ServiceB,方法methodB,事務級別定義爲PROPAGATION_MANDATORY
###案例
先調用ServiceA.methodA,發現沒有運行在事務中,以非事務運行。再調用ServiceB.methodB(這個要寫在ServiceA.methodA內部),發現已經運行在ServiceA.methodA的沒有事務,拋出異常。
##PROPAGATION_REQUIRES_NEW ###簡介
新建事務,若是當前存在事務,把當前事務掛起
###設計
類ServiceA,方法methodA,事務級別定義爲PROPAGATION_REQUIRED 類ServiceB,方法methodB,事務級別定義爲PROPAGATION_REQUIRES_NEW
###案例
先調用ServiceA.methodA,發現沒有運行在事務中,分配一個新事務。再調用ServiceB.methodB(這個要寫在ServiceA.methodA內部),當執行到ServiceB.methodB的時候,ServiceA.methodA事務就會掛起,ServiceB.methodB啓一個新的事務,等待ServiceB.methodB的事務完成之後,ServiceA.methodA的事務才繼續執行。
###總結
ServiceB.methodB已經提交,那麼ServiceA.methodA失敗回滾,ServiceB.methodB是不會回滾的。若是ServiceB.methodB失敗回滾,它拋出的異常被ServiceA.methodA捕獲,ServiceA.methodA事務仍然能夠提交。
##PROPAGATION_NOT_SUPPORTED ###簡介
以非事務方式執行操做,若是當前存在事務,就把當前事務掛起
###設計
類ServiceA,方法methodA,事務級別定義爲PROPAGATION_REQUIRED 類ServiceB,方法methodB,事務級別定義爲PROPAGATION_NOT_SUPPORTED
###案例
先調用ServiceA.methodA,發現沒有運行在事務中,分配一個新事務。再調用ServiceB.methodB(這個要寫在ServiceA.methodA內部),當執行到ServiceB.methodB的時候,ServiceA.methodA的事務掛起,ServiceB.methodB以非事務的狀態運行完,再繼續ServiceA.methodA的事務。
###總結
ServiceB.methodB數據操做出現異常不會回滾。
##PROPAGATION_NEVER ###簡介
以非事務方式執行,若是當前存在事務,則拋出異常
###設計
類ServiceA,方法methodA,事務級別定義爲PROPAGATION_REQUIRED 類ServiceB,方法methodB,事務級別定義爲PROPAGATION_NEVER
###案例
先調用ServiceA.methodA,發現沒有運行在事務中,分配一個新事務。再調用ServiceB.methodB(這個要寫在ServiceA.methodA內部),拋出異常。
##PROPAGATION_NESTED ###簡介
理解Nested的關鍵是savepoint
###總結
Nested的事務和它的父事務是相依的,它的提交是要等和它的父事務一塊提交的。也就是說,若是父事務最後回滾,它也要回滾的。而Nested事務的好處是它有一個savepoint。也就是說ServiceB.methodB失敗回滾,那麼ServiceA.methodA也會回滾到savepoint點上,ServiceA.methodA能夠選擇另一個分支,好比ServiceC.methodC,繼續執行,來嘗試完成本身的事務。可是這個事務並無在EJB標準中定義