【问题标题】:Transaction Propagation in EJBs methodsEJB 方法中的事务传播
【发布时间】:2015-08-01 13:01:14
【问题描述】:

我想确保正确理解事务传播,请帮助。

假设我们有一个无状态的EJB_A,它暴露了应用层的服务。

它使用本地无状态 EJB_BEJB_C , 它们都使用容器管理的 EntityManager
EJB_BEJB_C 使用彼此的方法。

如果我理解正确,每个 EJB 都会拥有自己的 EntityManager 实例来管理相同的持久性单元。

假设EJB_A,在一个客户端请求中,使用bot EJB_B和EJB_C的方法来创建一个事务,例如:

@Stateless(name = "myejb")

    public class EJB_A implements Interface_EJB_A
    {
        @EJB
        private EJB_B ejb_b;

        @EJB
        private EJB_C ejb_c;

    public String method()
    {

    ejb_b.call();
    ejb_c.call();

    }

    ...
    }

注入 EJB_C 的实体管理器如何知道有一个事务正在进行
如果它对注入 EJB_B 的 EntityManager 的存在一无所知?

这是我很难掌握的容器之王添加的魔法......

【问题讨论】:

    标签: java jpa ejb remote-access


    【解决方案1】:

    容器内部使用ThreadLocal 变量来存储事务。并且实体管理器使用的持久化上下文与该事务同步。因此,EJB A、B 和 C 所做的工作都链接到同一个持久化上下文,并在同一个事务中完成。

    规格说明:

    默认情况下,容器管理的持久化上下文是 SynchronizationType.SYNCHRONIZED 并自动加入当前事务。

    [...]

    应用程序可以通过注入或在 JNDI 命名空间中直接查找来获得具有事务范围持久性上下文的容器管理实体管理器。实体管理器的持久化上下文类型默认或定义为 PersistenceContextType.TRANSACTION。

    当容器管理的实体管理器在活动 JTA 事务的范围内被调用 [82] 时,一个新的持久性上下文开始,并且没有与 JTA 事务相关联的当前持久性上下文。创建持久性上下文,然后将其与 JTA 事务关联。

    [...]

    如第 7.1 节所述,单个持久性上下文可能对应于一个或多个 JTA 实体管理器实例(都与同一个实体管理器工厂相关联[84])。 当传播 JTA 事务时,持久性上下文会在实体管理器实例中传播。

    【讨论】:

      猜你喜欢
      • 2014-09-03
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      相关资源
      最近更新 更多