Oráculo
Ao usar o Oracle, você deve executar a seguinte consulta SQL:
SELECT RAWTOHEX(tx.xid)
FROM v$transaction tx
JOIN v$session s ON tx.ses_addr = s.saddr
A
v$transaction
view fornece informações sobre as transações de banco de dados em execução no momento. No entanto, pode haver várias transações em execução em nosso sistema, e é por isso que estamos participando da v$transaction
com a v$session
Visão. A
v$session
view oferece informações sobre nossa sessão atual ou conexão com o banco de dados. Ao combinar o endereço da sessão entre a v$transaction
e v$session
views, podemos encontrar o identificador de transação em execução atual fornecido pelo xid
coluna na v$transaction
Visão. Porque o
xid
coluna é do tipo RAW
, estamos usando RAWTOHEX
para converter o valor binário do identificador de transação em sua representação hexadecimal. SQL Server
Ao usar o SQL Server, basta executar a seguinte consulta SQL:
SELECT CONVERT(VARCHAR, CURRENT_TRANSACTION_ID())
Porque o
CURRENT_TRANSACTION_ID
função retorna um BIGINT
valor da coluna, estamos usando CONVERT
para obter sua representação String. PostgreSQL
Ao usar o PostgreSQL Server, você pode executar a seguinte consulta SQL para obter o ID da transação atual:
SELECT CAST(txid_current() AS text)
Porque o
txid_current
função retorna um BIGINT
valor da coluna, estamos usando CAST
para obter sua representação String. MySQL e MariaDB
Ao usar MySQL ou MariaDB, você pode executar a seguinte consulta SQL para obter o ID da transação atual:
SELECT tx.trx_id
FROM information_schema.innodb_trx tx
WHERE tx.trx_mysql_thread_id = connection_id()
O
innodb_trx
ver no information_schema
catalog fornece informações sobre as transações de banco de dados em execução no momento. Como pode haver várias transações em execução em nosso sistema, precisamos filtrar as linhas de transação combinando a sessão ou o identificador de conexão do banco de dados com a sessão em execução no momento. HSQLDB
Ao usar o banco de dados HyperSQL, você pode executar a seguinte consulta SQL para obter o ID da transação atual:
VALUES (TRANSACTION_ID())
Registrando o ID da transação usando MDC
O id de transação é útil para registro porque nos permite agregar todas as ações que foram executadas no contexto de uma determinada transação de banco de dados.
Supondo que tenhamos encapsulado as consultas SQL acima em um
transactionId
podemos extrair o ID da transação atual e passá-lo para o framework Logger como uma variável MDC. Então, para SLF4J, você pode usar o comando
put
como ilustrado pelo exemplo a seguir:MDC.put("txId", String.format(" TxId: [%s]", transactionId(entityManager)));
MDC (Mapped Diagnostic Context) é para registrar o que
ThreadLocal
é para threads Java. Basicamente, o MDC permite que você registre pares de chave/valor que estão confinados ao thread em execução no momento e que você pode fazer referência quando a estrutura de log cria mensagens de log. Para imprimir a variável de log "txId" no log, precisamos incluir essa variável no padrão de anexador de log:
<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>
O
%X{txId}
padrão é usado para referenciar o txId
variável de log.