No creo que haya entendido la responsabilidad de la clase UserTransaction
. No existe para proporcionarle acceso a la transacción actual en ejecución. Se usa para iniciar cualquier comunicación con el Administrador de transacciones del contenedor, especialmente para las transacciones iniciadas y finalizadas administradas por el bean; es por eso que no debe acceder desde un contexto de transacción administrado por contenedor.
Me gustaría saber, ¿hay alguna otra forma de acceder al método getStatus()?
No, uno no puede, al menos no usar las API EJB. Uno puede, como máximo, usar interceptores EJB para registrar el hecho de que se han invocado los métodos EJB. Tendrá que ser bastante inteligente para rastrear el estado de las llamadas y luego inferir el estado de la transacción.
Si no son reacios a utilizar las API específicas de contenedores, es posible acceder a la transacción subyacente. Sea prevenido, ya que el siguiente enfoque podría no funcionar si no sabe cómo usarlo, o si el contenedor le prohíbe hacerlo. El mecanismo que se describe a continuación es cómo SpringFramework obtiene acceso al administrador de transacciones JTA y puede crear y gestionar transacciones.
En el caso de Oracle WebLogic, se puede obtener una referencia a la TranactionHelper class
, que puede ser utilizado para obtener una referencia a la current transaction asociado con el hilo de rosca, cuyo status puede ser obtenida. Apuntaría al sources of the Transaction SPI for JTA in the Spring framework, si necesita seguir este curso para otros servidores de aplicaciones.
Sólo para complementar, valores de estado de transacción se definen en [la clase de estado] (https://docs.oracle.com/javaee/6/api/javax /transaction/Status.html). Para resumir: 'STATUS_ACTIVE = 0; STATUS_MARKED_ROLLBACK = 1; STATUS_PREPARED = 2; STATUS_COMMITTED = 3; STATUS_ROLLEDBACK = 4; STATUS_UNKNOWN = 5; STATUS_NO_TRANSACTION = 6; STATUS_PREPARING = 7; STATUS_COMMITTING = 8; STATUS_ROLLING_BACK = 9; ' –