JPA 究竟何时REQUIRES_NEW事务提交

2022-09-04 21:56:33

在弹簧容器中,代码如下:

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()

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 何时提交?为EJB回答它,但它似乎与JPA的行为不同。

我调试了它,我只能在结束后看到对DB的影响,但这对我来说似乎很奇怪,我在这里错过了什么吗?m2()m1()

更新:

我正在将我检索到的实体传递到并从那里更新它。因此,实际上合并实体可以解决这个问题,Mik378的答案是正确的。m1()m2()m2()


答案 1

从这里

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

REQUIRES_NEW启动新事务,即使上下文中存在现有事务也是如此。

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


答案 2

推荐