Tru*_* Ha 16 java ejb jta java-ee bean-managed-transactions
我有一个带有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();
}
}
Run Code Online (Sandbox Code Playgroud)
那么如何UserTransaction传播到OtherStatelessBeanLocalbean呢?
Dav*_*ins 32
该UserTransaction对象是容器提供的对象,它包装对容器内部使用的API调用的访问,特别是javax.transaction.TransactionManager.该TransactionManager有方法,如begin,commit,rollback和javax.transaction.Transaction getTransaction()
在封面下,TransactionManager将使用ThreadLocal或类似技术来跟踪线程的当前事务状态.ThreadLocals是非常简单的对象,很容易被描述为static HashMap使用线程名称作为键和您选择的对象作为值.只要您保持在同一个线程中,就可以从调用链中的任何位置获取对象.这是不允许在Java EE环境中启动线程的原因之一.
安全传播以类似的方式工作,JNDI查找也可以神奇地指向正确的模块或组件的java:comp/env命名空间.底线是你没有ThreadLocals就无法实现app服务器.传播听起来比它更活跃,实际上它只是不离开线程的行为所以容器和所有参与者仍然可以找到你的"东西".
回到事务管理术语,TransactionManager将在其ThreadLocal中跟踪的对象通常(直接或间接)实现Transaction和TransactionSynchronizationRegistry接口.在这两个接口之间,容器具有代表您在当前事务中跟踪DataSources,EntityManagers和其他资源所需的所有钩子.这些接口还允许容器提供回调,例如SessionSynchronization,以及在事务完成时代表您执行其他操作的方法,例如刷新/关闭EntityManagers,发送JMS挂起消息以及在应用程序中保留应用程序创建的任何计时器交易.