viernes, 8 de abril de 2016

CONTROL DE TRANSACCIONES DESDE PROCEDIMIENTOS INFORMIX - Controling transactions from Informix Stored procedures

Muchas veces se nos da la situación de que un procedimiento debe hacer muchas operaciones que conviene englobar dentro de una transaccion.
Esto lo solucionamos incluyendo todas las instrucciones entre las etiquetas BEGIN WORK y COMMIT WORK.
El problema viene cuando este procedimiento puede ser llamado desde diferentes sitios, es decir, puedo intentar ejecutarlo desde una aplicación Java, PHP o incluso desde el propio dbaccess y no sabemos si cuando se hace la llamada la transacción ya se encuentra abierta o no.

Para solucionar este problema lo que suelo hacer es capturar el error -535 (Already in transaction), de forma que cuando intento abrir la transacción en el procedimiento salta esta excepcion asumo que quien lo está ejecutando ya ha abierto la transaccion previamente.
Si he detectado que existe una transaccion abierta previa, evito cerrar la transaccion dentro del procedimiento para que siga su curso.

Por ejemplo:

CREATE PROCEDURE sp_myProcedure ()

DEFINE transactionOpen SMALLINT;

ON EXCEPTION IN (-535)
   LET transactionOpen = 1; --      Activo la variable de control
END EXCEPTION WITH RESUME;

LET transactionOpen = 0; -- Incia el procedimiento poniendo valor 0 a la variable de control
BEGIN WORK; -- En este momento saltaria la excepcion -535 y se activaria a 1 la variable de control
---
---
---
--- Solo cierro la transaccion si no se ha activado la variable transactionOpen
---
IF transactionOpen = 0 THEN
    COMMIT WORK;
END IF;
END PROCEDURE



Espero que os sirva de utilidad.

1 comentario: