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