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.