Jakarta ee 访问容器管理bean中的事务状态

Jakarta ee 访问容器管理bean中的事务状态,jakarta-ee,ejb,jta,distributed-transactions,Jakarta Ee,Ejb,Jta,Distributed Transactions,我有一个使用容器管理事务的@Stateless。有没有办法访问javax.transaction.UserTransaction的“状态”?也就是说,在bean方法中调用UserTransaction.getStatus() 我知道在容器管理的bean中禁止访问UserTransaction,但我想知道,有没有其他方法可以访问getStatus()方法?我认为您不理解UserTransaction类的责任。它不存在以向您提供对当前正在运行的事务的访问权限。它用于启动与容器的事务管理器的任何通信,

我有一个使用容器管理事务的
@Stateless
。有没有办法访问javax.transaction.UserTransaction的“状态”?也就是说,在bean方法中调用
UserTransaction.getStatus()


我知道在容器管理的bean中禁止访问
UserTransaction
,但我想知道,有没有其他方法可以访问
getStatus()
方法?

我认为您不理解
UserTransaction
类的责任。它不存在以向您提供对当前正在运行的事务的访问权限。它用于启动与容器的事务管理器的任何通信,特别是对于开始和结束bean管理的事务;这就是为什么您不能从容器管理的事务上下文访问它

我想知道,还有其他方法可以访问getStatus()方法吗

不,不能,至少不使用EJBAPI。人们最多可以使用EJB拦截器记录已调用EJB方法的事实。您需要非常智能地跨调用跟踪状态,然后推断事务状态

如果您不反对使用特定于容器的API,则可以访问底层事务请提前警告,因为如果您不知道如何使用下面列出的方法,或者如果容器禁止您这样做,则下面列出的方法可能不起作用。下面描述的机制是SpringFramework如何访问JTA事务管理器并能够创建和管理事务


在Oracle WebLogic的情况下,可以获取对的引用,该引用可用于获取对与线程关联的的的引用,该线程可以获取。如果您需要为其他应用程序服务器学习此课程,我想指出。

如果您只需要知道事务是否标记为回滚,那么请使用EJBContext.getRollbackOnly。否则,使用JTA 1.1,您可以使用TransactionSynchronizationRegistry:

TransactionSynchronizationRegistry tsr = (TransactionSynchronizationRegistry)
  new InitialContext().lookup("java:comp/TransactionSynchronizationRegistry");
int status = tsr.getTransactionStatus()

作为补充,在中定义了事务状态值。总结:
STATUS\u ACTIVE=0;状态\标记\回滚=1;状态_PREPARED=2;承诺状态=3;状态_回滚=4;状态_未知=5;状态\无\交易=6;准备状态=7;状态_=8;状态_回滚_=9