Vic*_*cky 5 ejb jta distributed-transactions java-ee
我有一个使用容器管理事务的@Stateless EJB.有没有办法获得"状态" javax.transaction.UserTransaction?也就是说,调用UserTransaction.getStatus()bean方法?
我知道UserTransaction在容器管理的bean中禁止访问,但我想知道,有没有其他方法可以访问getStatus()方法?
Bre*_*ail 12
如果您只需要知道事务是否标记为回滚,则使用EJBContext.getRollbackOnly.否则,使用JTA 1.1,您可以使用TransactionSynchronizationRegistry:
TransactionSynchronizationRegistry tsr = (TransactionSynchronizationRegistry)
new InitialContext().lookup("java:comp/TransactionSynchronizationRegistry");
int status = tsr.getTransactionStatus()
Run Code Online (Sandbox Code Playgroud)
我认为你还没有理解班级的责任UserTransaction。它的存在并不能让您访问当前正在运行的事务。它用于启动与容器的事务管理器的任何通信,特别是开始和结束 bean 管理的事务;这就是为什么您不能从容器管理的事务上下文访问它。
我想知道,还有其他方法可以访问 getStatus() 方法吗?
不,不能,至少不能使用 EJB API。人们最多可以使用 EJB 拦截器来记录 EJB 方法已被调用这一事实。您需要非常聪明才能跟踪调用之间的状态,然后推断事务状态。
如果您不反对使用容器特定的 API,您也许能够访问底层事务。请预先警告,如果您不知道如何使用下面列出的方法,或者如果容器禁止您这样做,则下面列出的方法可能不起作用。下面描述的机制是 SpringFramework 如何访问 JTA 事务管理器并能够创建和管理事务。
对于 Oracle WebLogic,可以获取对 的引用TranactionHelper class,该引用可用于获取对与线程关联的当前事务的引用,可以获取线程的状态。如果您需要为其他应用程序服务器学习本课程,我会指出Spring 框架中 JTA 的事务 SPI 的来源。
| 归档时间: |
|
| 查看次数: |
7976 次 |
| 最近记录: |