【问题标题】:JPA EntityManager - when the transaction starts?JPA EntityManager - 事务何时开始?
【发布时间】:2014-03-11 11:09:50
【问题描述】:

我对事务的生命周期、实体管理器和 EJB 容器中的持久性上下文感到困惑。

我是这样使用实体管理器的:

 @PersistenceContext(unitName = "..")
 private EntityManager em;

在每个无状态的 ejb 中。

我的问题很简单:

  1. 事务何时开始?
  2. 事务如何传播?即当无状态ejb相互调用时,它们是否继续使用相同的事务?
  3. 事务何时提交?

【问题讨论】:

    标签: jpa transactions ejb java-ee-7


    【解决方案1】:

    对于容器管理的事务:

    1. 事务 (TX) 在调用第一个事务方法时开始。默认情况下,所有 EJB 方法都是事务性的(相当于 TransactionAttributeType.REQUIRED,这是默认设置)。

    2. 默认的 TX 传播在所有本地 EJB 调用中保持相同的 TX。这等效于所有调用方法上的显式TrasactionAttributeType.REQUIRED

    3. 当调用链中的第一个方法(为其创建 TX)返回时,事务被提交。

    您可以通过使用不同的 TransactionAttributeTypes 注释 EJB 方法来对 TX 传播进行细粒度控制。

    【讨论】:

    • 大约 3- 如果我有 3 个 ejb:A、B 和 C。B 和 C 都有注释 @PersistenceContext 并且 A 没有任何实体管理器。所以如果 A 调用 B 创建一个实体,然后 A 调用 C 创建另一个实体,那么我们有两个不同的事务?
    • PersistenceContext 独立于事务。注入的 PersistenceContext 可以参与事务,但不会启动事务。
    • 如果 PersistenceContext 不能启动事务,什么会启动它?
    • 我想我现在明白了。您说“所有 EJB 方法都是事务性的”,那么 A 中的 ejb 方法是启动事务的那个?
    • 确切地说,与调用顺序无关,默认情况下将使用在所有方法上传播的单个 TX。在您的情况下 - 从 A 到 B 和从 A 到 C。bean B 和 C 的实体管理器将在此 TX 中登记。一旦 A 中的方法返回,它将提交。 TX默认由容器启动。
    猜你喜欢
    • 2017-07-25
    • 1970-01-01
    • 2019-10-12
    • 2018-04-19
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    相关资源
    最近更新 更多