什么时候JPA REQUIRES_NEW事务提交确实

Ahm*_*leh 9 java spring hibernate jpa java-ee

在弹簧容器中,使用以下代码:

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() {
        ...
    }

}
Run Code Online (Sandbox Code Playgroud)

什么时候创建的交易完全m2()提交?一旦m2()调用结束,或一旦m1()调用结束?

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)什么时候提交?为EJB回答它,但它似乎与JPA不一样.

我调试了它,我只能m2()在m1()结束后看到DB 的效果,但这对我来说似乎很奇怪,我在这里错过了一些东西吗?

更新:

我将检索m1()到的实体传递给m2()并从那里更新.所以,实际上合并实体m2()解决了这个问题并且Mik378答案是正确的.

Mik*_*378 6

从这里:

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

REQUIRES_NEW 即使上下文中存在现有事务,也会启动新事务.

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

  • 所有这些都没有说明它何时 - 新事务 - 实际提交,并且调试显示我否则。我更新了我的问题请看一看:) (3认同)