A veces queremos saber cuales son las características de la transacción actual ¿es “read only”? ¿tiene acceso exclusivo a las tablas? si hay un conflicto al actualizar o borrar datos ¿espera o inmediatamente sale con error?, etc.

La siguiente vista nos dará esa información:

SELECT
   MON$TRANSACTION_ID             AS tnIdentificadorTransaccion,
   MON$ATTACHMENT_ID              AS tnIdentificadorConexion,
   IIF(MON$STATE = 1, 'ACTIVA', 'INACTIVA') AS tcEstadoTransaccion,
   MON$TIMESTAMP                  AS tdFechaHora,
   MON$TOP_TRANSACTION            AS tnUltimaTransaccion,
   MON$OLDEST_TRANSACTION         AS tnOldestInterestingTransaction,
   MON$OLDEST_ACTIVE              AS tnOldestActiveTransaction,
   DECODE(MON$ISOLATION_MODE, 0, 'Acceso exclusivo', 1, 'Lecturas repetidas', 2, 'Lee filas confirmadas inmediatamente', 3, 'No lee una fila si otra transacción la usa') AS tcModoAislamiento,
   DECODE(MON$LOCK_TIMEOUT, -1, 'Espera por siempre', 0, 'No espera', 'Espera ' || MON$LOCK_TIMEOUT || ' segundos') AS tcTiempoEspera,
   IIF(MON$READ_ONLY = 1, 'Read Only', 'Read Write')               AS tcReadOnly,
   IIF(MON$AUTO_COMMIT = 1, 'Auto COMMIT', 'No auto COMMIT')       AS tcAutoCommit,
   IIF(MON$AUTO_UNDO = 1, 'Tiene savepoint', 'No tiene savepoint') AS tcAutoUndo,
   MON$STAT_ID                                                     AS tnIdentificadorEstadisticas
FROM
   MON$TRANSACTIONS
WHERE
   MON$ATTACHMENT_ID  = CURRENT_CONNECTION AND
   MON$TRANSACTION_ID = CURRENT_TRANSACTION;

Si la transacción es SNAPSHOT TABLE STABILITY entonces tiene acceso exclusivo a todas las tablas (algo no recomendable en Firebird)

Si la transacción es SNAPSHOT entonces las lecturas pueden repetirse muchas veces y siempre se obtendrán los mismos resultados. Suele ser la más aconsejable para las consultas (SELECT, FETCH)

Si la transacción es READ COMMITED RECORD_VERSION entonces la última versión confirmada del registro es leída inmediatamente. Es la opción por defecto. Suele ser la más aconsejable para mantenimiento de los datos (INSERT, UPDATE, DELETE)

Si la transacción es READ COMMITED NO RECORD_VERSION y otra transacción tiene una versión no confirmada del registro, la transacción actual espera hasta que la otra transacción termine con un COMMIT o con un ROLLBACK (si el modo de bloqueo es WAIT) o termina inmediatamente con error (si el modo de bloqueo es NO WAIT). Estas transacciones pueden causar muchos “deadlock”, por lo tanto hay que pensar muy bien si es el aislamiento correcto.

Es aconsejable que la consulta anterior se guarde como una vista entonces cuando quieras saber las características de la transacción actual simplemente escribes:

SELECT * FROM V_TRANSACCION_ACTUAL

y listo, ya podrás saberlas.

Artículos relacionados:

Entendiendo las transacciones

Modos de bloqueo de las transacciones

El índice del blog Firebird21