【发布时间】:2017-10-11 08:13:25
【问题描述】:
我有两个班级:
@Service
@Transaction
class A {
public void method1() {
private B;
try {
save1()
b.method2()
} catch (SqlException e) {
doSomeThing();
}
@Autowired
public setB(){
this.B = B;
}
}
}
@Service
class B {
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
public void method2(){
save2()
throw new SqlException();
}
}
正如预期的那样,我得到了一个SqlException,但也得到了一个UnexpectedRollBackException,程序停止了。
我想知道为什么save2()持久化的数据没有回滚?
外部事务有问题吗?
更新:我尝试在 A 类中捕获 UnexpectedRollBackException 并且一切正常。但我仍然需要某种解释为什么我会得到例外?我想当内部事务开始时外部事务应该被挂起,那么为什么外部事务的回滚是意外的?
谢谢。
【问题讨论】:
-
阅读 Ilya Dyoshin 的回答。因为
B不是托管bean,所以只有一个事务在两个方法调用上运行,因此没有拦截器应用于B#method2,其中包括事务拦截器。
标签: java spring transactions