【问题标题】:What kind of transaction context does an injected EntityManager have in an EJB whose transaction context is TransactionAttributeType.NOT_SUPPORTED?在事务上下文为 TransactionAttributeType.NOT_SUPPORTED 的 EJB 中,注入的 EntityManager 具有什么样的事务上下文?
【发布时间】:2013-05-09 21:00:57
【问题描述】:

假设我有一个带有以下注释的 EJB:

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)

进一步假设它有一个EntityManager 注入其中:

@PersistenceContext
private EntityManager em;

如果我对EntityManager 执行各种操作,是否会为每个此类操作启动并提交资源本地事务?还是会有一个适合所有人的?还是 JPA 规范未定义此行为?我在 JPA 2.0 规范或 EJB 3.1 规范中都找不到合适的段落。

我了解不会为 EJB 方法启动 JTA 事务,但我不清楚哪些类型的事务将对底层 EntityManager 有效。我假设行为是未定义的,但我希望来自更大的 StackOverflow 社区的人更了解,或者对规范的这个领域有洞察力,或者对涉及这个领域的讨论有深入的了解。

【问题讨论】:

    标签: jpa ejb


    【解决方案1】:

    以下是 JSR 318 和第 13.6.5 节的一些摘录,可能会解决大部分问题。

    13.6.2.1 NOT_SUPPORTED

    容器调用一个企业 bean 方法,其事务 属性设置为未指定的 NOT_SUPPORTED 值 事务上下文。

    如果客户端使用事务上下文调用,容器会挂起 事务上下文与当前线程的关联 在调用企业 bean 的业务方法之前。容器 当业务方法有时恢复暂停的关联 完全的。客户端的挂起事务上下文不是 传递给资源管理器或其他企业 bean 对象 从业务方法调用。

    如果业务方法调用其他企业 bean,则容器 调用时不传递任何事务上下文。

    13.6.5 处理以“未指定的事务上下文”运行的方法

    EJB 规范没有规定容器应该如何 使用未指定的事务管理方法的执行 上下文——事务语义留给容器 执行。容器如何选择的一些技术 使用未指定的事务实现方法的执行 上下文如下(列表不包括所有可能的 策略):

    • 容器可以在没有事务上下文的情况下执行该方法并访问底层资源管理器。
    • 容器可以将实例对资源管理器的每次调用视为单个事务(例如,容器可以设置 JDBC 连接上的自动提交选项)。
    • 容器可以将一个实例对资源管理器的多次调用合并到一个事务中。
    • 容器可以将一个实例对多个资源管理器的多个调用合并到一个事务中。
    • 如果一个实例调用其他企业 bean 上的方法,并且调用的方法也被指定以未指定的方式运行 事务上下文,容器可以合并资源管理器 从多个实例调用到单个事务中。
    • 以上任意组合。

    如上文规范第 13.6.2.1 节所述,正在描述客户端和容器之间的上下文交互。

    在第 13.6.5 节中,描述了容器处理此类事务的底层机制,但这取决于实现。

    【讨论】:

      【解决方案2】:

      正如 Nayan Wadekar 所指出的,EntityManager 将没有关联的事务。

      在您的示例中,您指定了一个事务范围的 EntityManager(如果未另行指定,则为默认值)。这意味着需要活动事务的方法将抛出 TransactionRequiredException,例如 persist

      [Throws] TransactionRequiredException - if invoked on a container-managed entity manager of type PersistenceContextType.TRANSACTION and there is no transaction
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-17
        • 2013-07-14
        • 1970-01-01
        相关资源
        最近更新 更多