Oracle
Når du bruger Oracle, skal du udføre følgende SQL-forespørgsel:
SELECT RAWTOHEX(tx.xid)
FROM v$transaction tx
JOIN v$session s ON tx.ses_addr = s.saddr
v$transaction
visningen giver information om de aktuelle databasetransaktioner. Der kan dog være flere transaktioner, der kører i vores system, og det er derfor, vi tilslutter os v$transaction
med v$session
se.
v$session
view tilbyder information om vores aktuelle session eller databaseforbindelse. Ved at matche sessionsadressen mellem v$transaction
og v$session
visninger, kan vi finde den aktuelle kørende transaktions-id givet af xid
kolonnen i v$transaction
se.
Fordi xid
kolonnen er af typen RAW
, vi bruger RAWTOHEX
at konvertere transaktionsidentifikatorens binære værdi til dens hexadecimale repræsentation.
SQL-server
Når du bruger SQL Server, skal du blot udføre følgende SQL-forespørgsel:
SELECT CONVERT(VARCHAR, CURRENT_TRANSACTION_ID())
Fordi CURRENT_TRANSACTION_ID
funktion returnerer en BIGINT
kolonneværdi, bruger vi CONVERT
for at få dens String-repræsentation.
PostgreSQL
Når du bruger PostgreSQL Server, kan du udføre følgende SQL-forespørgsel for at få det aktuelle transaktions-id:
SELECT CAST(txid_current() AS text)
Fordi txid_current
funktion returnerer en BIGINT
kolonneværdi, bruger vi CAST
for at få dens String-repræsentation.
MySQL og MariaDB
Når du bruger MySQL eller MariaDB, kan du udføre følgende SQL-forespørgsel for at få det aktuelle transaktions-id:
SELECT tx.trx_id
FROM information_schema.innodb_trx tx
WHERE tx.trx_mysql_thread_id = connection_id()
innodb_trx
se i information_schema
katalog giver information om de aktuelle databasetransaktioner. Da der kan køre flere transaktioner i vores system, er vi nødt til at filtrere transaktionsrækkerne ved at matche sessions- eller databaseforbindelses-id'et med den aktuelle session.
HSQLDB
Når du bruger HyperSQL-databasen, kan du udføre følgende SQL-forespørgsel for at få det aktuelle transaktions-id:
VALUES (TRANSACTION_ID())
Logføring af transaktions-id ved hjælp af MDC
Transaktions-id'et er nyttigt til logning, fordi det giver os mulighed for at aggregere alle handlinger, der blev udført i forbindelse med en given databasetransaktion.
Forudsat at vi har indkapslet SQL-forespørgslerne ovenfor i et transactionId
metode, kunne vi udtrække det aktuelle transaktions-id og videregive det til Logger-rammeværket som en MDC-variabel.
Så for SLF4J kan du bruge put
metode som illustreret af følgende eksempel:
MDC.put("txId", String.format(" TxId: [%s]", transactionId(entityManager)));
MDC (Mapped Diagnostic Context)
er til at logge hvad ThreadLocal
er til Java-tråde. Grundlæggende giver MDC dig mulighed for at registrere nøgle/værdi-par, der er begrænset til den aktuelt kørende tråd, og som du kan referere til, når logningsrammen opbygger logmeddelelser.
For at udskrive "txId"-logvariablen til loggen, skal vi inkludere denne variabel i logappender-mønsteret:
<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>
%X{txId}
mønster bruges til at referere til txId
log variabel.