@Transactional REQUIRED中的第二个tx打破第一个?

时间:2013-12-23 23:59:00

标签: spring hibernate transactional propagation

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

public void callerMethod() {
     call1();
     call2();
}

@Transactional(propagation=REQUIRED)
public void call1() {
}

@Transactional(propagation=REQUIRED)
public void call2() {
}

我读过的是,当调用call2()时,由于传播策略是REQUIRED,它使用“现有事务(如果可用)”,“因为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中的一些外部异常( )),这不是自己的声明吗?

由于 杨

1 个答案:

答案 0 :(得分:0)

交易是在方法结束时提交的。为了按预期传播事务,需要从call1()的主体调用call2()。