1. 程式人生 > >spring事務傳播性理解

spring事務傳播性理解

code 捕獲 就會 拋出異常 事務 支持 tro 復制代碼 區分

什麽是spring的事務傳播性

個人的理解,

首先先說一下事務傳播性,事務傳播性就是,事務中還包括另外的事務,事務之間是怎麽相互影響,然後如何執行的,這就是事務傳播性

spring事務傳播性就是spring中是如何去規定事務是如何執行的,情況如下:

public class DemoServiceA {
    //事務A
    @Transactional(propagation=Propagation.REQUIRED)//對於外層事務來說(相對的,如果demoMthodA加到demoMthodC中,demoMthodC就是外層了),只區分包括事務沒有
    public void demoMethodA() {  
        code1; 
        demoServiceB.demoMethodB();
// A事務中加入了 B事務 code4; } } public class DemoServiceB { //事務B @Transactional(propagation=待定...) public void demoMethodB() { code2; code3; } }

待定的情況如下

七個事務傳播屬性

 PROPAGATION_REQUIRED -- 支持當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。
 PROPAGATION_SUPPORTS -- 支持當前事務,如果當前沒有事務,就以非事務方式執行。
 PROPAGATION_MANDATORY

-- 支持當前事務,如果當前沒有事務,就拋出異常。
 PROPAGATION_REQUIRES_NEW -- 新建事務,如果當前存在事務,把當前事務掛起。
 PROPAGATION_NOT_SUPPORTED -- 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
 PROPAGATION_NEVER -- 以非事務方式執行,如果當前存在事務,則拋出異常。
 PROPAGATION_NESTED--如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則進行與PROPAGATION_REQUIRED類似的操作。

詳細點就是下面:

1: REQUIRED

加入當前正要執行的事務不在另外一個事務裏,那麽就起一個新的事務

比如說,DemoServiceB.demoMethodB的事務級別定義為REQUIRED, 那麽由於執行DemoServiceA.demoMethodA的時候,

DemoServiceA.demoMethodA已經起了事務,這時調用DemoServiceB.demoMethodB,DemoServiceB.demoMethodB看到自己已經運行在DemoServiceA.demoMethodA

的事務內部,就不再起新的事務。而假如DemoServiceA.demoMethodA運行的時候發現自己沒有在事務中,他就會為自己分配一個事務。

這樣,在DemoServiceA.demoMethodA或者在DemoServiceB.demoMethodB內的任何地方出現異常,事務都會被回滾。即使DemoServiceB.demoMethodB的事務已經被

提交,但是DemoServiceA.demoMethodA在接下來fail要回滾,DemoServiceB.demoMethodB也要回滾

2: SUPPORTS 如果當前在事務中,即以事務的形式運行,如果當前不再一個事務中,那麽就以非事務的形式運行 3: MANDATORY 必須在一個事務中運行。也就是說,他只能被一個父事務調用。否則,他就要拋出異常 4: REQUIRES_NEW 這個就比較繞口了。 比如我們設計DemoServiceA.demoMethodA的事務級別為REQUIRED,DemoServiceB.demoMethodB的事務級別為REQUIRES_NEW, 那麽當執行到DemoServiceB.demoMethodB的時候,DemoServiceA.demoMethodA所在的事務就會掛起,DemoServiceB.demoMethodB會起一個新的事務,等待DemoServiceB.demoMethodB的事務完成以後, 他才繼續執行。他與REQUIRED 的事務區別在於事務的回滾程度了。因為DemoServiceB.demoMethodB是新起一個事務,那麽就是存在 兩個不同的事務。如果DemoServiceB.demoMethodB已經提交,那麽DemoServiceA.demoMethodA失敗回滾,DemoServiceB.demoMethodB是不會回滾的。如果DemoServiceB.demoMethodB失敗回滾, 如果他拋出的異常被DemoServiceA.demoMethodA捕獲,DemoServiceA.demoMethodA事務仍然可能提交。 5: NOT_SUPPORTED 當前不支持事務。比如DemoServiceA.demoMethodA的事務級別是REQUIRED ,而DemoServiceB.demoMethodB的事務級別是NOT_SUPPORTED , 那麽當執行到DemoServiceB.demoMethodB時,DemoServiceA.demoMethodA的事務掛起,而他以非事務的狀態運行完,再繼續DemoServiceA.demoMethodA的事務。 6: NEVER 不能在事務中運行。假設DemoServiceA.demoMethodA的事務級別是REQUIRED, 而DemoServiceB.demoMethodB的事務級別是NEVER , 那麽DemoServiceB.demoMethodB就要拋出異常了。 7: NESTED 理解Nested的關鍵是savepoint。他與REQUIRES_NEW的區別是,REQUIRES_NEW另起一個事務,將會與他的父事務相互獨立, 而Nested的事務和他的父事務是相依的,他的提交是要等和他的父事務一塊提交的。也就是說,如果父事務最後回滾,他也要回滾的。 復制代碼

總的來說

1.當事務中方法中還有事務的時候,多事務是如何相互影響,如何去執行的,spring的事務傳播性就規定了細節,例如如何回滾問題,7中傳播級別

2.A事務中有B事務,要考慮A,B事務如何執行,A中只需要考慮有沒有事務就ok,B的話就需要具體看是那種事務傳播性了。

spring事務傳播性理解