spring事務傳播性(PROPAGATION)

spring事務傳播性


##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標準中定義
相關文章
相關標籤/搜索