Oracle
Při použití Oracle musíte provést následující SQL dotaz:
SELECT RAWTOHEX(tx.xid)
FROM v$transaction tx
JOIN v$session s ON tx.ses_addr = s.saddr
v$transaction
pohled poskytuje informace o aktuálně probíhajících databázových transakcích. V našem systému však může probíhat více transakcí, a proto se připojujeme k v$transaction
pomocí v$session
zobrazit.
v$session
zobrazit nabízí informace o naší aktuální relaci nebo připojení k databázi. Porovnáním adresy relace mezi v$transaction
a v$session
zobrazení, můžeme najít aktuálně běžící identifikátor transakce daný xid
ve sloupci v$transaction
zobrazit.
Protože xid
sloupec je typu RAW
, používáme RAWTOHEX
převést binární hodnotu identifikátoru transakce na jeho hexadecimální reprezentaci.
SQL Server
Při použití SQL Serveru stačí provést následující SQL dotaz:
SELECT CONVERT(VARCHAR, CURRENT_TRANSACTION_ID())
Protože CURRENT_TRANSACTION_ID
funkce vrací BIGINT
hodnotu sloupce, používáme CONVERT
získat jeho Řetězcovou reprezentaci.
PostgreSQL
Když používáte PostgreSQL Server, můžete spustit následující SQL dotaz pro získání aktuálního ID transakce:
SELECT CAST(txid_current() AS text)
Protože txid_current
funkce vrací BIGINT
hodnotu sloupce, používáme CAST
získat jeho Řetězcovou reprezentaci.
MySQL a MariaDB
Když používáte MySQL nebo MariaDB, můžete spustit následující SQL dotaz, abyste získali aktuální ID transakce:
SELECT tx.trx_id
FROM information_schema.innodb_trx tx
WHERE tx.trx_mysql_thread_id = connection_id()
innodb_trx
zobrazit v information_schema
katalog poskytuje informace o aktuálně probíhajících databázových transakcích. Vzhledem k tomu, že v našem systému může být spuštěno více transakcí, potřebujeme filtrovat řádky transakcí tak, že se identifikátor relace nebo připojení k databázi shoduje s aktuálně běžící relací.
HSQLDB
Při použití databáze HyperSQL můžete provést následující dotaz SQL a získat aktuální ID transakce:
VALUES (TRANSACTION_ID())
Zaprotokolování ID transakce pomocí MDC
ID transakce je užitečné pro protokolování, protože nám umožňuje agregovat všechny akce, které byly provedeny v kontextu dané databázové transakce.
Za předpokladu, že jsme výše uvedené dotazy SQL zapouzdřili do transactionId
metodou, mohli bychom extrahovat aktuální ID transakce a předat jej frameworku Logger jako proměnnou MDC.
Takže pro SLF4J můžete použít put
způsob, jak je znázorněno na následujícím příkladu:
MDC.put("txId", String.format(" TxId: [%s]", transactionId(entityManager)));
MDC (Mapped Diagnostic Context)
je pro protokolování toho, co ThreadLocal
je do vláken Java. MDC vám v zásadě umožňuje zaregistrovat páry klíč/hodnota, které jsou omezeny na aktuálně běžící vlákno a na které se můžete odkazovat, když protokolovací rámec vytváří zprávy protokolu.
Chcete-li vytisknout proměnnou protokolu „txId“ do protokolu, musíme tuto proměnnou zahrnout do vzoru appender protokolu:
<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}
vzor se používá k odkazování na txId
logovat proměnnou.