EntityManager 嵌套事务原子性

EntityManager nested transaction atomicity

在遗留代码中,我解决了嵌套事务的问题。 (Spring、CDI 等只能使用纯 JPA(EclipseLink))

em.getTransaction().begin();
em.persist(client);

em2.getTransaction().begin();
em2.persist(client1);            //saved into DB
em2.getTransaction().commit(); 

em.getTransaction().rollback();


public void method(){
    EntityManager em = entityManagerFactory.createEntityManager();
    em.getTransaction().begin();
    em.persist(client);

    nestedTransactionMethod();

    em.getTransaction().rollback();
}

public void nestedTransactionMethod(){
    EntityManager em = entityManagerFactory.createEntityManager();
    em.getTransaction().begin();
    em.persist(client);
    em.getTransaction().commit();
}

问题是当我调用打开事务的内部方法时,另一个具有自事务的方法不是原子行为。有没有解决方案如何在不给开放实体管理器作为参数的情况下实现这一目标?

JPA 和 JTA 不支持嵌套事务。

当您需要一个整体的事务管理系统时。不如用一个。 有很多可能性。 Spring是其中之一还是应用服务器中的JavaEE容器管理系统。 您还可以使用符合 JTA 的事务管理器自行处理整个操作。我告诉你一个基于Jboss TM 写过分布式事务管理系统的人 -> 不要这样做,这并不容易,而且会花费大量时间。