Oráculo
Al usar Oracle, debe ejecutar la siguiente consulta SQL:
SELECT RAWTOHEX(tx.xid)
FROM v$transaction tx
JOIN v$session s ON tx.ses_addr = s.saddr
La v$transaction
view proporciona información sobre las transacciones de la base de datos que se están ejecutando actualmente. Sin embargo, puede haber múltiples transacciones ejecutándose en nuestro sistema, y es por eso que nos unimos a v$transaction
con la v$session
ver.
La v$session
view ofrece información sobre nuestra sesión actual o conexión a la base de datos. Haciendo coincidir la dirección de sesión entre v$transaction
y v$session
vistas, podemos encontrar el identificador de transacción en ejecución actual dado por el xid
columna en la v$transaction
ver.
Porque el xid
la columna es de tipo RAW
, estamos usando RAWTOHEX
para convertir el valor binario del identificador de transacción a su representación hexadecimal.
Servidor SQL
Al usar SQL Server, solo tiene que ejecutar la siguiente consulta SQL:
SELECT CONVERT(VARCHAR, CURRENT_TRANSACTION_ID())
Porque el CURRENT_TRANSACTION_ID
la función devuelve un BIGINT
valor de la columna, estamos usando CONVERT
para obtener su representación de cadena.
PostgreSQL
Al usar el servidor PostgreSQL, puede ejecutar la siguiente consulta SQL para obtener la identificación de la transacción actual:
SELECT CAST(txid_current() AS text)
Porque el txid_current
la función devuelve un BIGINT
valor de la columna, estamos usando CAST
para obtener su representación de cadena.
MySQL y MariaDB
Al usar MySQL o MariaDB, puede ejecutar la siguiente consulta SQL para obtener la identificación de la transacción actual:
SELECT tx.trx_id
FROM information_schema.innodb_trx tx
WHERE tx.trx_mysql_thread_id = connection_id()
El innodb_trx
ver en el information_schema
El catálogo proporciona información sobre las transacciones de la base de datos que se están ejecutando actualmente. Dado que puede haber múltiples transacciones ejecutándose en nuestro sistema, debemos filtrar las filas de transacciones haciendo coincidir el identificador de sesión o de conexión de la base de datos con la sesión que se está ejecutando actualmente.
HSQLDB
Al usar la base de datos HyperSQL, puede ejecutar la siguiente consulta SQL para obtener la identificación de la transacción actual:
VALUES (TRANSACTION_ID())
Registrando la identificación de la transacción usando MDC
La identificación de la transacción es útil para el registro porque nos permite agregar todas las acciones que se ejecutaron en el contexto de una transacción de base de datos dada.
Suponiendo que hemos encapsulado las consultas SQL anteriores en un transactionId
método, podríamos extraer la identificación de la transacción actual y pasarla al marco Logger como una variable MDC.
Entonces, para SLF4J, puede usar el put
método como se ilustra en el siguiente ejemplo:
MDC.put("txId", String.format(" TxId: [%s]", transactionId(entityManager)));
MDC (Contexto de diagnóstico asignado)
es para registrar lo que ThreadLocal
es para subprocesos de Java. Básicamente, MDC le permite registrar pares clave/valor que están confinados al subproceso que se está ejecutando actualmente y a los que puede hacer referencia cuando el marco de registro genera mensajes de registro.
Para imprimir la variable de registro "txId" en el registro, debemos incluir esta variable en el patrón del agregador de registro:
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>TRACE</level>
</filter>
<encoder>
<Pattern>%-5p [%t]:%X{txId} %c{1} - %m%n</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
El %X{txId}
el patrón se usa para hacer referencia al txId
variable de registro.