我不太清楚@Transactional 与传播=必需的行为。我在网上经常看到的一个例子是这样的:
public void callerMethod() {
call1();
call2();
}
@Transactional(propagation=REQUIRED)
public void call1() {
}
@Transactional(propagation=REQUIRED)
public void call2() {
}
我读到的是,当调用 call2() 时,因为传播策略是必需的,所以它使用“现有事务(如果可用)”,“因为 call1() 打开了一个事务,所以 call2() 将继续使用那个”。
我的问题是,调用 call1() 时, call1() 末尾的 tx 代理代码(通过 Spring 的 AOP 添加)不会关闭事务吗?如果没有,那么它不关闭现有 tx 的关键是什么?例如,如果我在两者之间调用了一个非事务性方法:
public void callerMethod() {
call1();
call3();
call2();
}
public void call3() {
}
在这种情况下, call2() 是否仍然在 call1() 开始的 tx 中被调用?
无论如何,在第一种情况下(call1() 和 call2() 被背靠背调用),如果 call2() 抛出 runtimeException,那么整个 tx 会回滚。这对于 call1() 的声明来说变得相当意外,因为它声明它的整个方法应该一起失败或一起成功,但是现在它的所有代码都成功了,但是 tx 被回滚(由于 call2() 中的一些外部异常)),这不与它自己的声明相矛盾吗?
谢谢杨