我有这样的代码:
public void createTerminal(TerminalDo terminalDo) {
final EntityManagerFactory emf = JpaFactory.getEntityManagerFactory();
final EntityManager em = emf.createEntityManager();
EntityTransaction etx = null;
try {
etx = em.getTransaction();
etx.begin();
// persist method make the passed Object stored in the persistence
// context
em.persist(terminalDo);
etx.commit();
} catch (Exception e) {
if (etx != null && etx.isActive())
etx.rollback();
e.printStackTrace();
} finally {
em.close();
}
}
这是一种交易方法。 我不知道是否可以创建另一个调用此事务处理方法的事务方法, 然后将实体管理的事务嵌套到另一个事务中, 这是一个好习惯吗?
public void makeAllThat(TerminalDo terminalDo, ApplicationDo applicationDo) {
final EntityManagerFactory emf = JpaFactory.getEntityManagerFactory();
final EntityManager em = emf.createEntityManager();
EntityTransaction etx = null;
try {
etx = em.getTransaction();
etx.begin();
createTerminal(terminalDo);
createApplication(applicationDo);
//do many other transactions...
.....
etx.commit();
} catch (Exception e) {
if (etx != null && etx.isActive())
etx.rollback();
e.printStackTrace();
} finally {
em.close();
}
}
答案 0 :(得分:1)
您要求的是称为嵌套交易。仅JPA没有具体说明。持久性单元可以有两种类型:RESOURCE_LOCAL(您使用EntityTransaction
时的情况)和JTA。 JTA也被称为not requiring nested transactions。但是你的情况是RESOURCE_LOCAL,AFIK依赖于你的JDBC驱动程序,数据库和数据库引擎。
重要说明:您展示的示例是并行事务的示例,因为您使用EntityManager
createApplication()EntityManagerFactory.createEntityManager()' is independent of each other. In your case, if
createTerminal()`创建的每个fails,
实例都将拥有其事务提交(请测试并在评论中确认)!
通常你没有嵌套事务,我建议使用JTA事务(使用支持声明式事务的框架,如Spring或EJB),因为它现在确实是一个标准。