Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como obter o ID de transação atual do banco de dados usando JDBC ou Hibernate?

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.