domingo, 22 de abril de 2012

JTA vs XA (weblogic and Oracle) distributed transactions / Transacciones distribuidas

En esta ocasión vamos a ver unas determinadas casuísticas que a veces pueden ser un verdadero quebradero de cabeza, de cara a identificar y resolver este tipo de problemas. Este articulo se basa en tecnologías weblogic y oracle.

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...

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).

Para esto asignamos en el connection pool JBDC para conexiones XA el valor de XASetTransactionTimeout a true y XATransactionTimeout a 0 (de esta forma el timeout de XA se ajusta automaticamente al tiempo de timeout del Transaction manager). Si el sistema en cuestion tiene tiempos definidos de timeout que resultan de un estudio de vinculación con otros sitemas, se debe asignar el valor de XATransactionTimeout a un valor mayor al de JTA Transacion timeout.

Podemos realizar estos ajustes desde la consola de weblogic únicamente.

Espero que ayude! :)

No hay comentarios:

Publicar un comentario