sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo obtener la identificación de transacción de la base de datos actual usando JDBC o Hibernate?

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.