EntityManager嵌套事务原子性

Mil*_*aid 3 java jpa transactions eclipselink java-ee

在遗留代码中,我解决了嵌套事务的问题.(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();
}
Run Code Online (Sandbox Code Playgroud)

问题是当我调用inside方法时,在其中打开事务的另一个方法是自我事务,而不是表现为原子.有没有解决方法如何实现这一点而不给出开放的实体经理作为参数?

mh-*_*dev 5

JPA和JTA不支持嵌套事务.

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