Oracle
Als u Oracle gebruikt, moet u de volgende SQL-query uitvoeren:
SELECT RAWTOHEX(tx.xid)
FROM v$transaction tx
JOIN v$session s ON tx.ses_addr = s.saddr
De v$transaction
view biedt informatie over de momenteel lopende databasetransacties. Er kunnen echter meerdere transacties in ons systeem worden uitgevoerd en daarom doen we mee aan de v$transaction
met de v$session
bekijken.
De v$session
view biedt informatie over onze huidige sessie of databaseverbinding. Door het sessie-adres te matchen tussen de v$transaction
en v$session
weergaven, kunnen we de huidige lopende transactie-ID vinden die wordt gegeven door de xid
kolom in de v$transaction
bekijken.
Omdat de xid
kolom is van het type RAW
, we gebruiken RAWTOHEX
om de binaire waarde van de transactie-ID om te zetten in zijn hexadecimale weergave.
SQL-server
Als u SQL Server gebruikt, hoeft u alleen maar de volgende SQL-query uit te voeren:
SELECT CONVERT(VARCHAR, CURRENT_TRANSACTION_ID())
Omdat de CURRENT_TRANSACTION_ID
functie retourneert een BIGINT
kolomwaarde gebruiken we CONVERT
om zijn String-representatie te krijgen.
PostgreSQL
Als u PostgreSQL Server gebruikt, kunt u de volgende SQL-query uitvoeren om de huidige transactie-ID te krijgen:
SELECT CAST(txid_current() AS text)
Omdat de txid_current
functie retourneert een BIGINT
kolomwaarde, we gebruiken CAST
om zijn String-representatie te krijgen.
MySQL en MariaDB
Wanneer u MySQL of MariaDB gebruikt, kunt u de volgende SQL-query uitvoeren om de huidige transactie-ID te krijgen:
SELECT tx.trx_id
FROM information_schema.innodb_trx tx
WHERE tx.trx_mysql_thread_id = connection_id()
De innodb_trx
bekijken in het information_schema
catalogus biedt informatie over de momenteel lopende databasetransacties. Aangezien er meerdere transacties in ons systeem kunnen worden uitgevoerd, moeten we de transactierijen filteren door de sessie- of databaseverbindingsidentificatie te matchen met de momenteel lopende sessie.
HSQLDB
Wanneer u de HyperSQL-database gebruikt, kunt u de volgende SQL-query uitvoeren om de huidige transactie-ID te krijgen:
VALUES (TRANSACTION_ID())
De transactie-ID loggen met MDC
De transactie-ID is handig voor het loggen omdat het ons in staat stelt om alle acties te aggregeren die zijn uitgevoerd in de context van een bepaalde databasetransactie.
Ervan uitgaande dat we de bovenstaande SQL-query's hebben ingekapseld in een transactionId
methode, kunnen we de huidige transactie-ID extraheren en doorgeven aan het Logger-framework als een MDC-variabele.
Dus voor SLF4J kun je de put
. gebruiken methode zoals geïllustreerd door het volgende voorbeeld:
MDC.put("txId", String.format(" TxId: [%s]", transactionId(entityManager)));
MDC (in kaart gebrachte diagnostische context)
is voor het loggen van wat ThreadLocal
is naar Java-threads. Kortom, met MDC kunt u sleutel/waarde-paren registreren die beperkt zijn tot de huidige thread en waarnaar u kunt verwijzen wanneer het logging-framework logberichten bouwt.
Om de logvariabele "txId" naar het logbestand af te drukken, moeten we deze variabele opnemen in het log-appenderpatroon:
<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>
De %X{txId}
patroon wordt gebruikt om te verwijzen naar de txId
log variabele.