【发布时间】:2020-07-14 01:27:45
【问题描述】:
我正在使用 DB2 数据库并测试了以下代码: 无论methodB是否有Propagation.REQUIRES_NEW,如果methodB有异常,methodA的结果都会正确提交。
这与我的假设相反,即必须使用 Propagation.REQUIRES_NEW 来实现这一点。
ClassA
@Autowire
private ClassB classB;
@Transactional
methodA(){
...
try{
classB.methodB();
}catch(RuntimeException ex){
handleException(ex);
}
...
}
ClassB
@Transactional(propagation = Propagation.REQUIRES_NEW)
methodB(){...}
感谢@Kayaman,我想我现在明白了。
我看到的行为是因为methodB的@Transactional注解不起作用,所以methodB被当成没有any事务注解的普通函数。
问题出在方法A中,我从super.methodB()的ClassB的子类中调用了methodB,并认为它会给出一个事务方法B,但它不起作用:
@Service
@Primary
ClassC extends ClassB{
@override
methodB(){
super.methodB();
}
}
我知道如果您从同一类的另一个非事务方法调用事务方法,事务注释将不起作用。
不知道super.methodB() 也会因为同样的原因而失败(任何人都可以提供更多解释吗?)
总之,在第一块代码的例子中,当methodB出现RuntimeException时,
如果methodB有NO transaction注解:A&B共享同一个事务; methodA 不会回滚
如果methodB有REQUIRED注解:A&B共享同一个事务; methodA 会回滚
如果methodB有REQUIRES_NEW注解:A&B有单独的事务; methodA 不会回滚
【问题讨论】:
标签: java transactions spring-transactions