【问题标题】:When are transactions commited with JEE JPA (EclipseLink 2.0)?何时使用 JEE JPA (EclipseLink 2.0) 提交事务?
【发布时间】:2017-04-11 21:45:33
【问题描述】:

何时使用 JPA (EclipseLink 2.0) 提交事务?

这是我的问题:

public void methodA()
{
    while(something)
    {
       methodB();
    }
}

public void methodB()
{
   //Insert new client into Client table.
}

假设完成methodA 需要 10 分钟。如果在methodA 运行时查看数据库的客户端表,我将看不到任何行。这意味着在methodB 结束后,事务未提交。但是如果我等到methodA 完成,那么客户端就会出现在数据库中。

我希望在methodB 结束后提交每个事务。我该怎么做?

编辑:我希望应用程序容器(Glassfish)负责“提交”。我不想通过调用实体管理器来做到这一点。我正在寻找诸如methodB() 上方的注释之类的东西。这两种方法都在一个单例 bean 中。

【问题讨论】:

  • 您将事务定义/分界放在哪里?显然,如果使用本地事务,任何人都可以调用 em.getTransaction() 并提交它
  • 我不想承诺自己。我希望应用程序容器处理它(Glassfish 3.1.2.2)。

标签: java jpa transactions eclipselink commit


【解决方案1】:

使用@Stateless EJB bean,事务在离开 EJB 时提交(默认情况下)。

将methodB()放在单独的EJB中。(假设methodA()不是EJB)

【讨论】:

  • Jmmm 我想这可能是一个解决方案......但这会极大地影响我的设计。难道没有更优雅的方式来做到这一点吗?也许在methodB上面加注解?
  • @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 方法注释。但是只有在从其他类调用它时才会创建新事务,然后是“this”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 2020-02-11
  • 2011-08-24
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多