gpt4 book ai didi

java - UserTransaction 如何传播?

转载 作者:太空狗 更新时间:2023-10-29 22:43:21 25 4
gpt4 key购买 nike

我有一个带有 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?

最佳答案

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

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

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

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

关于java - UserTransaction 如何传播?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4118353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com