Spring:Spring嵌套事務方式


Spring遇到嵌套事務時,怎么實現

實驗時卻遇到一個奇怪的問題:


1、當ServiceA.a()方法調用ServiceB.b()方法時,內層事務提交和回滾,都不受外層事務提交或回滾的影響。


2、當ServiceA.a()方法調用ServiceA.c()方法時,內層事務不能正確地提交或回滾。

 

如下:

xxxServiceA類中,有如下兩個方法。

 

@Transactional 
method_One() {
    method_Two();
}


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

 

沒有找到類似creating new transaction的輸出,同一個Service類中,spring並不重新創建新事務,如果是兩不同的Service,就會創建新事務了。

 

xxxServiceA類:

@Transactional 
method_One() {
    method_Two();
}

xxxServiceB類:

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

Propagation.REQUIRES_NEW生效創建了一個新事務

 

讓事務起作用,遇到錯誤進行回滾,應該注意的事項

第一種情況:同一個類中 一個方法無嵌套方法

如果方法名上加上@Transactional注解,方法內不要用try catch ;如果必須要用try catch ,則catch中必須用throw new RuntimeException()。否則事務不起作用。


第二種情況:同一個類中 方法A嵌套方法B
方法A有@Transactional,方法內都沒有try catch,事務起作用。
方法A有@Transactional和try catch,並且catch中用throw new RuntimeException(),事務起作用。


第三種情況:不同類中方法C嵌套方法B
方法B上加上@Transactional注解,方法內不要用try catch ;如果必須要用try catch ,則catch中必須用throw new RuntimeException()。否則方法B的事務不起作用。
方法C上加上@Transactional注解,方法內不要用try catch ;如果必須要用try catch ,則catch中必須用throw new RuntimeException(),此時方法B怎么寫都行。否則方法C的事務不起作用。

 

 

文章轉載至:https://blog.csdn.net/m0_37701381/article/details/85066711


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM