在一个 Spring 容器中,使用以下代码:
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()
调用结束时?
当使用EJB时,@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)会在什么时候提交?该答案对于JPA似乎不适用。
我进行了调试,并且只能看到m2()
对数据库产生影响后,m1()
才结束,但这对我来说似乎很奇怪,我错过了什么吗?
更新:
我在m1()
中检索的实体传递给了m2()
并从那里进行了更新。 因此,在m2()
中合并实体可以解决这个问题,Mik378的答案是正确的。
m1()
创建的事务被回滚,但我仍然得到了m2()
事务更改后提交的结果。 - Ahmad Y. Salehm2()
后的m1()
中加入Thread.sleep(10000)
,并在这 10 秒内检查m2()
插入的元素是否已提交,会怎样呢? - Mik378