0

我不太清楚@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() 中的一些外部异常)),这不与它自己的声明相矛盾吗?

谢谢杨

4

1 回答 1

0

事务在方法结束时提交。为了像您期望的那样传播事务,需要从 call1() 的主体调用 call2()。

于 2013-12-24T06:21:49.933 回答