EntityManager嵌套事务原子性

时间:2015-05-04 05:17:15

标签: java java-ee jpa transactions eclipselink

在遗留代码中,我解决了嵌套事务的问题。 (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();
}
问题是,当我调用inside方法时,在其中打开事务的另一个方法是自我事务,而不是表现为原子。是否有任何解决方案如何在不将开放实体管理器作为参数的情况下实现此目的?

1 个答案:

答案 0 :(得分:5)

JPA和JTA不支持嵌套事务。

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