【问题标题】:How does UserTransaction propagate?UserTransaction 如何传播?
【发布时间】:2013-07-29 04:38:41
【问题描述】:

我有一个带有 bean 管理事务的无状态 bean,以及这样的方法:

@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class ... {

    @Resource 
    private UserTransaction ut;
    @EJB 
    private OtherStatelessBeanLocal other;

    public void invokeSomeMethods() 
        ut.begin();
        ...

        // invoke other bean's methods here.
        other.method();

        ...
        ut.commit();

    }

}

那么UserTransaction 是如何传播到OtherStatelessBeanLocal bean 的呢?

【问题讨论】:

  • 好吧,不是吗?

标签: java jakarta-ee ejb jta bean-managed-transactions


【解决方案1】:

UserTransaction 对象是容器提供的对象,它封装了对容器内部使用的 API 调用的访问,特别是 javax.transaction.TransactionManagerTransactionManager 具有 begincommitrollbackjavax.transaction.Transaction getTransaction() 等方法

在幕后,TransactionManager 将使用ThreadLocal 或类似技术来跟踪线程的当前事务状态。 ThreadLocals 是非常简单的对象,可以很容易地描述为static HashMap,它使用线程名称作为键,您选择的对象作为值。只要保持在同一个线程中,就可以从调用链中的任意点获取对象。这是不允许在 Java EE 环境中启动线程的原因之一。

安全传播的工作方式类似,JNDI 查找也神奇地指向正确的模块或组件的 java:comp/env 命名空间。底线是您无法实现没有 ThreadLocals 的应用服务器。传播听起来比实际更活跃,但实际上它只是不离开线程的行为,因此容器和所有相关人员仍然可以找到您的“东西”。

回到事务管理术语,TransactionManager 将在其 ThreadLocal 中跟踪的对象通常会(直接或间接)实现TransactionTransactionSynchronizationRegistry 接口。在这两个接口之间,容器具有它需要的所有钩子,可以代表您跟踪当前事务中的DataSources、EntityManagers 和其他资源。这些接口还允许容器提供回调,例如SessionSynchronization,以及在事务完成时代表您执行其他操作的方法,例如刷新/关闭 EntityManager、发送 JMS 挂起消息以及将您的应用程序创建的任何计时器保存在交易过程。

【讨论】:

  • 实际上不是,因为它没有将知识应用于所问的问题。
【解决方案2】:

基于 EJB 规范,您不能使用编程事务将事务上下文从一个 bean(在本例中为您的主类 ...)传递到另一个使用编程事务的 bean(在本例中为其他)

【讨论】:

    【解决方案3】:

    对于 EJB3,您通常使用 @TransactionAttribute 注释定义事务传播。

    所有 EJB 3.0 应用程序的默认事务属性都是必需的:

    如果客户端在客户端与事务上下文相关联时调用企业 bean 的方法,则容器会在客户端的事务上下文中调用企业 bean 的方法。

    交易类型的文档在这里:http://download.oracle.com/javaee/6/api/javax/ejb/TransactionAttributeType.html

    注意持久性上下文和事务传播通常同时发生,但并不总是 - 请注意。例如,有状态会话 bean 可能有一个extended persistence context

    【讨论】:

    • 请注意,在 EXTENDED 持久性上下文的情况下,持久性上下文仍然与事务独占关联,并且不能用于其他事务,因为只要持有 @Stateful bean 参与事务,在事务提交或回滚之前,不允许离开事务。从事务外部对该@Stateful bean 的所有请求都将等待@AccessTimeout 的持续时间,然后最终抛出某种形式的ConcurrentAccessException。
    猜你喜欢
    • 2013-07-27
    • 2012-02-29
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 2011-04-18
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多