Oracle
När du använder Oracle måste du köra följande SQL-fråga:
SELECT RAWTOHEX(tx.xid)
FROM v$transaction tx
JOIN v$session s ON tx.ses_addr = s.saddr
v$transaction
vyn ger information om de aktuella databastransaktionerna. Det kan dock finnas flera transaktioner som körs i vårt system, och det är därför vi går med i v$transaction
med v$session
visa.
v$session
view erbjuder information om vår nuvarande session eller databasanslutning. Genom att matcha sessionsadressen mellan v$transaction
och v$session
visningar kan vi hitta den aktuella transaktionsidentifieraren som ges av xid
kolumnen i v$transaction
visa.
Eftersom xid
kolumnen är av typen RAW
, vi använder RAWTOHEX
för att konvertera transaktionsidentifierarens binära värde till dess hexadecimala representation.
SQL-server
När du använder SQL Server behöver du bara köra följande SQL-fråga:
SELECT CONVERT(VARCHAR, CURRENT_TRANSACTION_ID())
Eftersom CURRENT_TRANSACTION_ID
funktion returnerar en BIGINT
kolumnvärde använder vi CONVERT
för att få dess strängrepresentation.
PostgreSQL
När du använder PostgreSQL Server kan du köra följande SQL-fråga för att få det aktuella transaktions-id:
SELECT CAST(txid_current() AS text)
Eftersom txid_current
funktion returnerar en BIGINT
kolumnvärde använder vi CAST
för att få dess strängrepresentation.
MySQL och MariaDB
När du använder MySQL eller MariaDB kan du köra följande SQL-fråga för att få det aktuella transaktions-id:
SELECT tx.trx_id
FROM information_schema.innodb_trx tx
WHERE tx.trx_mysql_thread_id = connection_id()
innodb_trx
visa i information_schema
katalogen ger information om de för närvarande pågående databastransaktionerna. Eftersom det kan finnas flera transaktioner som körs i vårt system måste vi filtrera transaktionsraderna genom att matcha sessionens eller databasanslutningsidentifieraren med den session som körs för närvarande.
HSQLDB
När du använder HyperSQL-databasen kan du köra följande SQL-fråga för att få det aktuella transaktions-id:
VALUES (TRANSACTION_ID())
Loggar transaktions-id med MDC
Transaktions-id:t är användbart för loggning eftersom det tillåter oss att aggregera alla åtgärder som utfördes i samband med en given databastransaktion.
Förutsatt att vi har kapslat in SQL-frågorna ovan i ett transactionId
metod, kunde vi extrahera det aktuella transaktions-id:t och skicka det till Logger-ramverket som en MDC-variabel.
Så för SLF4J kan du använda put
metod som illustreras av följande exempel:
MDC.put("txId", String.format(" TxId: [%s]", transactionId(entityManager)));
MDC (Mapped Diagnostic Context)
är för att logga vad ThreadLocal
är till Java-trådar. I grund och botten låter MDC dig registrera nyckel/värdepar som är begränsade till den aktuella tråden och som du kan referera till när loggningsramverket bygger loggmeddelanden.
För att skriva ut loggvariabeln "txId" till loggen måste vi inkludera denna variabel i loggbifogningsmönstret:
<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önstret används för att referera till txId
log variabel.