Cuando la diferencia entre la OAT (Oldest Active Transaction= transacción activa más antigua) y la NT (Next Transaction = siguiente transacción) es mayor que 1 y nadie está usando la Base de Datos podemos deducir que algún programa finalizó sin hacer un COMMIT o un ROLLBACK a su transacción.

Como sabemos, todas las transacciones deben finalizar con un COMMIT o con un ROLLBACK, inclusive las que solamente hacen un SELECT.

Si un programa no finaliza sus transacciones con un COMMIT o con un ROLLBACK eso está mal y debemos detectar cual es ese programa y corregir el problema.

El siguiente SELECT nos dirá el nombre del programa problemático:

SELECT
   *
FROM
   MON$ATTACHMENTS
WHERE
   MON$ATTACHMENT_ID = 
      (SELECT 
          MON$ATTACHMENT_ID 
       FROM 
          MON$TRANSACTIONS 
       WHERE 
          MON$TRANSACTION_ID = 
             (SELECT 
                 MIN(MON$TRANSACTION_ID) 
              FROM 
                 MON$TRANSACTIONS))

En la columna MON$REMOTE_PROCESS veremos el nombre del programa ejecutable (o sea, con extensión .EXE) que inició la transacción. Ese programa tiene un problema y debemos pedirle al programador que corrija el problema. El problema es que abrió una transacción y jamás la cerró. En otras palabras, en algún lugar le está faltando un COMMIT o un ROLLBACK.

Pero también puede haber otro motivo, mucho menos frecuente pero que a veces puede ocurrir: ese otro motivo es que el programa .EXE sí finaliza correctamente todas sus transacciones (con un COMMIT o con un ROLLBACK) pero ocurrió un corte de la energía eléctrica o un usuario presionó las teclas CTRL-ALT-DEL o presionó el botón de «Reset», y entonces aunque el .EXE finalizó no se cerraron las transacciones que tenía abiertas.

Artículos relacionados:

Entendiendo los identificadores de las transacciones

Verificando periódicamente los identificadores de las transacciones

El índice del blog Firebird21

El foro del blog Firebird21