【问题标题】:how to commit a transaction in EJB?如何在 EJB 中提交事务?
【发布时间】:2011-06-26 12:14:01
【问题描述】:

我有以下场景,

public void someEjbMethod1()
{
    for (int i=0; i=10; i++)
    {
        em.merge(arr[i]);
        em.flush();
    }
}

我需要分别合并 (arr[i]) 的每个对象。因为上面的代码将在函数结束时提交所有arr[i] 实例。

我正在考虑执行以下操作:

public void someEjbMethod1()
{
    for (int i=0; i=10; i++)
    {
        saveObj(arr[i]);
    }
}

// should I use a transaction attribute here??
public void saveObj(SomeObject obj)
{
    em.merge(arr[i]);
    em.flush();
}

【问题讨论】:

    标签: java transactions ejb


    【解决方案1】:

    如果您想要容器管理的事务,您可以使用带有值TransactionAttributeType.REQUIRES_NEW 的@TransactionAttribute 将saveObj 方法注释为:

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void saveObj(SomeObject obj)
    {
        ...
    }
    

    这将确保每次调用saveObj 方法都会启动一个新事务。与someEjbMethod 关联的现有事务将在每次调用saveObj 方法之前暂停。为saveObj 方法启动的每个事务都将在返回时提交,因此每个实体都将在其自己的事务中更新到数据库中。

    【讨论】:

    • “还是不行”是什么意思?事务创建是否在每次调用或其他情况下都失败?此外,考虑启用对 JTA 协调器的更精细调试;您将能够确定是否正在启动新事务。
    • 我的意思是,数据库不会在 saveObj 的每次退出时更新,但是,在应用服务器日志中,更新 sql 查询被打印了
    • 您使用的是哪个 JPA 提供程序?如果您使用的是 EclipseLink,您是否已将提供程序与 JTA transaction manager of OC4J 集成?
    • 我使用 oc4j 10.1.3.4 作为 EJB 容器,并将其捆绑的 toplink 作为 JPA 实现。
    • 我能想到一个可能的原因 - 是否有 ejb-jar.xmlorion-ejb-jar.xml 文件的条目会覆盖注释?通常,容器使用注解中声明的属性,除非有描述这些值的部署描述符。如果发生冲突,部署描述符中的值优先。
    【解决方案2】:

    您可以请求 UserTransaction,查看here 以获得一些灵感。

    【讨论】:

      猜你喜欢
      • 2018-06-21
      • 2013-04-05
      • 1970-01-01
      • 2014-01-14
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多