【问题标题】:entitymanager, transaction in transactionentitymanager,交易中的交易
【发布时间】:2014-05-14 14:01:08
【问题描述】:

我有这样的代码:

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

【问题讨论】:

  • 我认为你想在 JPA 中实现所谓的事务传播
  • 这正是我想要的。是否可以使用 JPA 进行“事务传播”,还是只能使用 Spring ?或者也许是 CDI ?
  • 抱歉回复晚了。从 JPA 的角度来看,事务传播 术语是指在单个 JTA 事务内的多个容器管理的实体管理器(事务范围或扩展)之间共享单个持久性上下文。仔细查看 @TransactionAttribute (EJB) 或 @Transactional (Spring) 并选择适合您的。

标签: jpa transactions entitymanager


【解决方案1】:

您所问的称为嵌套事务。单独的 JPA 并没有对此做出任何说明。持久性单元可以有两种类型:RESOURCE_LOCAL(您的情况,当您使用 EntityTransaction 时)和 JTA。 JTA 也称为not requiring nested transactions。但你的情况是 RESOURCE_LOCAL,AFIK 取决于你的 JDBC 驱动程序、数据库和数据库引擎。

重要说明:您展示的示例是并行事务的示例,因为您使用 EntityManagerFactory.createEntityManager()' is independent of each other. In your case, ifcreateApplication()fails,createTerminal()` 创建的每个 EntityManager 实例都将提交其事务(请进行测试并在评论中确认)!

通常你没有嵌套事务,我建议使用 JTA 事务(使用支持声明式事务的框架,如 Spring 或 EJB),因为它现在确实是一个标准。

【讨论】:

    猜你喜欢
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    相关资源
    最近更新 更多