En un contexto de transacciones disribuidas, aquellas en las que realizamos cambios en varias BBDD como una única transacción o en las que en una misma transacción participan recursos transaccionales de varios tipos, pueden plantearse problemas como este:
java.sql.SQLException:
Unexpected exception while enlisting XAConnection java.sql.SQLException: Not valid XID...
Unexpected exception while enlisting XAConnection java.sql.SQLException: Not valid XID...
Cuando weblogic inicia una transaccion (bien sea a través del contenedor de EJBs o bien a través de transacciones de usuario 'UserTransaction') y se usa una conexión XA (transaccional) de oracle, la transacción inciada en Oracle tiene como Transaction Manager (manejador de la transaccion) a la transaccion creada en weblogic, es este 'Transaction Manager' quien se debe de encargar de manejar el ciclo de vida de las transacciones asociadas a el de una manera correcta.
El problema descrito viene ocasionado porque el tiempo de timeout de JTA (manager) es mayor que el tiempo establecido al timeout de la transaccion XA, por lo que la transaccion en oracle genera un timeout, desvinculándose de su transaction manager de una forma no natural y quedando en un estado inconsistente, acaparando los recursos que ha solicitado hasta que la BBDD identifique a la transaccion como InDoubt y los libere.
¿Como podemos evitar esto?
Una regla a seguir es la siguente:
Debemos asegurar que el tiempo de timeout de las transacciones JTA (bien sea global o específicos de un EJB o una transaccion aislada) está asignado a un valor menor que el mas pequeño de los tiempos de timeout definidos para los recursos XA (como las conexiones XA de Oracle, o algunos recursos Tuxedo).
Podemos realizar estos ajustes desde la consola de weblogic únicamente.
Espero que ayude! :)
No hay comentarios:
Publicar un comentario