Mysql
 sql >> Database >  >> RDS >> Mysql

Come ottenere l'ID transazione del database corrente utilizzando JDBC o Hibernate?

Oracolo

Quando si utilizza Oracle, è necessario eseguire la seguente query SQL:

SELECT RAWTOHEX(tx.xid)
FROM v$transaction tx
JOIN v$session s ON tx.ses_addr = s.saddr

La v$transaction view fornisce informazioni sulle transazioni del database attualmente in esecuzione. Tuttavia, possono esserci più transazioni in esecuzione nel nostro sistema, ed è per questo che ci stiamo unendo alla v$transaction con la v$session visualizza.

La v$session view offre informazioni sulla nostra sessione corrente o sulla connessione al database. Abbinando l'indirizzo della sessione tra la v$transaction e v$session viste, possiamo trovare l'identificatore della transazione correntemente in esecuzione dato da xid colonna nella v$transaction visualizza.

Perché il xid la colonna è di tipo RAW , stiamo usando RAWTOHEX per convertire il valore binario dell'identificatore di transazione nella sua rappresentazione esadecimale.

SQL Server

Quando si utilizza SQL Server, è sufficiente eseguire la seguente query SQL:

SELECT CONVERT(VARCHAR, CURRENT_TRANSACTION_ID())

Perché il CURRENT_TRANSACTION_ID la funzione restituisce un BIGINT valore della colonna, stiamo usando CONVERT per ottenere la sua rappresentazione String.

PostgreSQL

Quando si utilizza PostgreSQL Server, è possibile eseguire la seguente query SQL per ottenere l'ID transazione corrente:

SELECT CAST(txid_current() AS text)

Perché il txid_current la funzione restituisce un BIGINT valore della colonna, stiamo usando CAST per ottenere la sua rappresentazione String.

MySQL e MariaDB

Quando si utilizza MySQL o MariaDB, è possibile eseguire la seguente query SQL per ottenere l'ID transazione corrente:

SELECT tx.trx_id
FROM information_schema.innodb_trx tx
WHERE tx.trx_mysql_thread_id = connection_id()

Il innodb_trx visualizza nel information_schema catalog fornisce informazioni sulle transazioni del database attualmente in esecuzione. Poiché possono esserci più transazioni in esecuzione nel nostro sistema, è necessario filtrare le righe delle transazioni facendo corrispondere l'identificatore di sessione o di connessione al database con la sessione attualmente in esecuzione.

HSQLDB

Quando si utilizza il database HyperSQL, è possibile eseguire la seguente query SQL per ottenere l'ID transazione corrente:

VALUES (TRANSACTION_ID())

Registrazione dell'ID transazione tramite MDC

L'ID transazione è utile per la registrazione perché ci consente di aggregare tutte le azioni eseguite nel contesto di una determinata transazione di database.

Supponendo di aver incapsulato le query SQL sopra in un transactionId metodo, potremmo estrarre l'ID transazione corrente e passarlo al framework Logger come variabile MDC.

Quindi, per SLF4J, puoi usare put metodo come illustrato dal seguente esempio:

MDC.put("txId", String.format(" TxId: [%s]", transactionId(entityManager)));

MDC (contesto diagnostico mappato) serve per registrare cosa ThreadLocal è ai thread Java. Fondamentalmente, MDC ti consente di registrare coppie chiave/valore che sono limitate al thread attualmente in esecuzione e a cui puoi fare riferimento quando il framework di registrazione crea messaggi di registro.

Per stampare la variabile di registro "txId" nel registro, è necessario includere questa variabile nel modello di appendice del 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>

Il %X{txId} pattern viene utilizzato per fare riferimento a txId variabile logaritmica.