一 前言、
在上一篇文章中,讲述了@Transactional注解方法内使用try catch导致注解失效的问题,今天,在处理方法之间调用时也存在关于@Transactional注解失效的问题,在这里简单记录下。
try catch导致@Transactional注解失效文章地址:https://blog.csdn.net/qq_65642052/article/details/133174164?spm=1001.2014.3001.5502
二 问题描述
大家在写代码过程中,或多或少会遇到如下问题:service层中有:类A中存在方法TestA,类B中存在方法TestB,类C中存在方法TestC,方法Test调用TestA,TestB,TestC,TestA、B、C均涉及数据库操作,要求:当任意一个方法发生错误时,TestA、B、C三个方法对数据库操作全部回滚;
public void Test(){
A.TestA();
B.TestB();
C.TestC();
}
那么大家认为@Transactional注解应该怎么加?加在哪里?
三 解决方法
经过我的测试情况如下:
(1)@Transactional注解注解加在Test()上,TestA、B、C不加@Transactional注解,数据库回滚情况:如果在testA()
、testB()
、testC()
中的任何一个方法发生异常,会导致整个test
方法的数据库操作回滚。
@Transactional
public void Test() {
A.TestA();
B.TestB();
C.TestC();
}
(2)@Transactional同时在Test
方法和TestA()
、TestB()
、TestC()
方法上添加:数据库回滚情况:无论是在Test()
方法还是TestA()
、TestB()
、TestC()
方法中发生异常,都会导致整个事务中的数据库操作回滚。
@Transactional
public void Test() {
TestA();
TestB();
TestC();
}
@Transactional
public void TestA() {
// ...
}
@Transactional
public void TestB() {
// ...
}
@Transactional
public void TestC() {
// ...
}
(3) @Transactional
仅在TestA()
、TestB()
、TestC()
方法上添加:数据库回滚情况:如果在TestA()
、TestB()
、TestC()
中的任何一个方法发生异常,会导致这个方法内的数据库操作回滚,但不会影响到Test()
方法。简单来说:C发生错误,C会回滚,A、B却不会回滚。
public void Test() {
TestA();
TestB();
TestC();
}
@Transactional
public void TestA() {
// ...
}
@Transactional
public void TestB() {
// ...
}
@Transactional
public void TestC() {
// ...
}
四 总结
对于上面三种情况,建议使用第二种方式,在Test
方法和TestA()
、TestB()
、TestC()
方法上同时添加@Transactional
注解。这样可以确保无论是在哪个方法中发生异常,整个事务中的数据库操作都会回滚,保持数据的一致性。