2015-05-04 4 views
3

В устаревшем коде я решаю проблему с вложенными транзакциями. (весна, CDI, и т.д., не может быть использована только чистым JPA (EclipseLink))EntityManager вложенная транзакция атомарности

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

проблема, когда я называю внутри метода, в котором открыт транзакции другого метода с самостоятельной сделкой, чем себя не атомарными. Есть ли какое-либо решение, как достичь этого, не предоставляя открытым менеджером сущностей в качестве параметра?

ответ

5

JPA и JTA не поддерживают вложенные транзакции.

Если вам нужна общая система управления транзакциями. Тогда используйте его. Есть много возможностей. Spring - одна из них или управляемая системой контейнера JavaEE на сервере приложений. Вы также можете обрабатывать всю операцию самостоятельно с помощью менеджера транзакций, совместимого с JTA. Я говорю вам, как тот, кто написал распределенную систему управления транзакциями на базе Jboss TM -> не делайте этого, это непросто, и это будет стоить огромного количества времени.

Смежные вопросы