在弹簧容器中,使用以下代码:
public class A {
@Transactional
public void m1() {
...
b.m2(); // call in a new transaction
...
}
}
public class B {
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void m2() {
...
}
}
何时提交了为m2()
创建的事务? m2()
调用何时结束,或m1()
调用何时结束?
When does @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) commit?为EJB回答它,但它似乎与JPA的行为不一样。
我调试了它,我只能在m2()
结束后看到m1()
对数据库的影响,但这对我来说很奇怪,我在这里遗漏了什么?
更新
我将我在m1()
中检索到的实体传递给m2()
并从那里更新。
所以,实际合并m2()
中的实体解决了这个问题, Mik378 答案是正确的。
答案 0 :(得分:6)
来自here:
即使上下文中存在现有事务,无论您是使用Spring Framework还是EJB,都要使用 REQUIRES_NEW事务属性可能会产生负面结果并导致 腐败和不一致的数据 REQUIRES_NEW交易 属性始终在方法启动时启动新事务, 是否存在现有交易。
REQUIRES_NEW
也会启动新事务。
所以简短的回答是:一旦m2()
调用结束