Como sabes, IN AUTONOMOUS TRANSACTION puede llegar a ser muy útil algunas veces porque todo lo que escribamos dentro de esa construcción finalizará con un COMMIT, sin importar como finalice la transacción principal (con un COMMIT o con un ROLLBACK)

Sin embargo … lastimosamente no es perfecta, tiene un problema que puede llegar a ser muy grave:

Dentro de un trigger de la Base de Datos relacionado con una transacción entra en un ciclo infinito.

Lo entenderemos mejor viendo el siguiente código:

CREATE TRIGGER TRANSACCION_INICIA
   ACTIVE ON TRANSACTION START
   POSITION 0
AS
BEGIN
   
   IN AUTONOMOUS TRANSACTION DO BEGIN

   END

END;

No importa lo que escribamos dentro del BEGIN … END de la transacción autónoma, y aún si nada escribimos como en este ejemplo, la Base de Datos se “colgará”. También se colgará si escribimos una sentencia simple (es decir, sin el BEGIN … END)

Los triggers de la Base de Datos en los cuales NUNCA JAMÁS debemos escribir IN AUTONOMOUS TRANSACTION son:

  • TRANSACTION START
  • TRANSACTION COMMIT
  • TRANSACTION ROLLBACK

En cualquiera de ellos, IN AUTONOMOUS TRANSACTION entrará en un ciclo infinito (no me preguntes el motivo, es así y ya. Evidentemente se trata de un “bug”).

Sin embargo, sí es posible usar IN AUTONOMOUS TRANSACTION con los triggers de conexión a la Base de Datos, con ellos no hay problema, es decir que puedes con toda tranquilidad escribirla en:

  • CONNECT
  • DISCONNECT

El siguiente código, sí funcionará, sin problemas:

CREATE TRIGGER CONEXION_INICIA
   ACTIVE ON CONNECT
   POSITION 0
AS
BEGIN
    
   IN AUTONOMOUS TRANSACTION DO BEGIN
    
   END
 
END;

Aquí funciona porque es un trigger de la Base de Datos relacionado con la conexión, con los que no funciona es con los relacionados a la transacción.

Artículos relacionados:

Registrando errores en una tabla de LOG

Otro ejemplo del uso de la tabla de LOG

El índice del blog Firebird21

El foro del blog Firebird21

Anuncios