JPA REQUIRES_NEW事务何时提交

14

在一个 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的答案是正确的。

1个回答

11

这里

无论您使用Spring Framework还是EJB,使用REQUIRES_NEW事务属性可能会产生负面影响,并导致数据损坏和不一致。
REQUIRES_NEW事务属性始终在方法启动时开始新事务,无论是否存在现有事务。

REQUIRES_NEW即使上下文中已经存在一个事务,也会启动一个新的事务。

所以简短的答案是:一旦m2()调用结束。


3
这并没有说明新交易实际提交的时间,而调试结果则与之不同。我更新了我的问题,请看一下 :) - Ahmad Y. Saleh
绝对,这是两个不同的类。我确信这是两个不同的事务;我尝试了第一种情况 - 为 m1() 创建的事务被回滚,但我仍然得到了 m2() 事务更改后提交的结果。 - Ahmad Y. Saleh
@Ahmad 如果你在调用 m2() 后的 m1() 中加入 Thread.sleep(10000),并在这 10 秒内检查 m2() 插入的元素是否已提交,会怎样呢? - Mik378
@Ahmad 确实很奇怪。 - Mik378
1
我更新了我的问题,现在它按照我想要的方式工作了,而且你是正确的。谢谢 :) - Ahmad Y. Saleh
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接