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
Deja un comentario