Error con IN AUTONOMOUS TRANSACTION

2 comentarios

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

Ejemplos del uso de Zebedee con Firebird

21 comentarios

Aquí hay algunos ejemplos del uso de Zebedee con Firebird.

En estos dos artículos, habíamos visto para que sirve Zebedee y como usarlo. Ahora, para aclarar mejor el tema, algunos ejemplos:

Usando Zebedee con Firebird

Usando Zebedee con Firebird. Parte 2

Servidor

Línea de comandos

START ZEBEDEE -s localhost:3050

Usando un archivo de configuración

START ZEBEDEE -f SERVIDOR1.ZBD

Cliente

Línea de comandos

START ZEBEDEE 3051:99.999.999.99:3050

Usando un archivo de configuración

START ZEBEDEE -f CLIENTE.ZBD

Conexión con una Base de Datos Firebird

CONNECT localhost/3051:E:\BASESDATOS\MiBase.FDB USER SYSDBA PASSWORD masterkey;

NOTAS:

  1. En la computadora donde se encuentra el Servidor de Zebedee debe estar abierto el puerto 11965
  2. Las demás computadoras no necesitan (y no deberían) tener puertos abiertos
  3. Cualquier usuario puede conectarse, no solamente SYSDBA, por supuesto que con sus nombres y passwords correctos
  4. No es obligatorio escribir el comando START, pero si no se lo escribe entonces la ventana “Símbolo del sistema” se queda congelada. Zebedee funciona igual, pero esas ventanas congeladas no les gustan a los usuarios
  5. Las computadoras Cliente deben poder acceder a la computadora Servidor. Eso significa que la IP del Servidor debe ser pública, de una VPN como Hamachi o encontrarse en una red local
  6. No suele justificarse usar Zebedee en una red local, porque el tiempo que se gana al enviar los datos comprimidos se pierde al comprimir y descomprimir esos datos. Se justificaría su uso si aún tratándose de una red local hay computadoras que no son confiables
  7. Si se usa un archivo de configuración, ese archivo no debe encontrarse en una carpeta compartida o cualquiera podría modificarlo a su antojo
  8. Si la conexión con el Servidor de Firebird se realiza a través de Internet entonces usar Zebedee (o algún programa similar) es un requisito ineludible

Artículos relacionados:

Proteger a las bases de datos visibles en Internet

Usando Zebedee con Firebird

Usando Zebedee con Firebird. Parte 2

El índice del blog Firebird21