添加PROPAGATION_REQUIRES_NEW 事務沒有產生做用

最近在作事務添加時  發現本身的事務沒有新建,上網查到   僅用做收藏。spring

其二  注意  事務的註解  應該在 內層的事務上面.net

1、描述
Spring遇到嵌套事務時,當被嵌套的事務被定義爲「PROPAGATION_REQUIRES_NEW」時,
內層Service的方法被調用時,外層方法的事務被掛起;
內層事務相對於外層事務是徹底獨立的,有獨立的隔離性等等。

2、實驗
但實驗時卻遇到一個奇怪的問題:
一、當ServiceA.a()方法調用ServiceB.b()方法時,內層事務提交和回滾,都不受外層事務提交或回滾的影響。
二、當ServiceA.a()方法調用ServiceA.c()方法時,內層事務不能正確地提交或回滾。

3、演示代碼
XXXService中,有下面兩個方法:
@Transactional 
method_One() {
    method_Two();
}


@Transactional(propagation = Propagation.REQUIRES_NEW) 
method_Two(){
    //do something
}

4、分析和結論
一、method_Two()會不會建立一個新事務? 
答:不會建立。仔細查看了日誌,沒有找到相似creating new transaction的輸出,應該是由於在同一個Service類中,spring並不從新建立新事務,若是是兩不一樣的Service,就會建立新事務了。 
那麼爲何spring只對跨Service的方法才生效? 
Debug代碼發現跨Service調用方法時,都會通過org.springframework.aop.framework.CglibAopProxy.DynamicAdvisedInterceptor.intercept()方法,只有通過此處,才能對事務進行控制。 

二、不一樣的Service調用方法時:
若是被調用方法是Propagation.REQUIRES_NEW,被catch後不拋出,事務能夠正常提交; 
若是被調用方法是Propagation.REQUIRED,被catch後不拋出,後面的代碼雖然能夠執行下去,但最終仍是會分出rollback-only異常;

三、同一個Service中調用方法時:
不論註解是Propagation.REQUIRES_NEW 仍是 Propagation.REQUIRED,
其結果都是同樣的,就是都被忽略掉了,等於沒寫。
當其拋出異常時,只需catch住不拋出,事務就能夠正常提交。

日誌

參考 http://blog.csdn.NET/chs_jdmdr/article/details/46411879blog

相關文章
相關標籤/搜索