【问题标题】:second tx in @Transactional REQUIRED breaks the first one?@Transactional REQUIRED 中的第二个 tx 打破了第一个?
【发布时间】:2014-01-12 05:32:29
【问题描述】:

我不太清楚@Transactional 在传播=REQUIRED 时的行为。我在网上经常看到的一个例子是这样的:

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() 中的一些外部异常)),这不是和它自己的声明相矛盾吗?

谢谢 杨

【问题讨论】:

    标签: spring hibernate transactional propagation


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-04
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多