Wyrocznia
Korzystając z Oracle, musisz wykonać następujące zapytanie SQL:
SELECT RAWTOHEX(tx.xid)
FROM v$transaction tx
JOIN v$session s ON tx.ses_addr = s.saddr
v$transaction
widok zawiera informacje o aktualnie uruchomionych transakcjach bazy danych. Jednak w naszym systemie może być uruchomionych wiele transakcji, dlatego dołączamy do v$transaction
z v$session
widok.
v$session
wyświetl oferty informacje o naszej aktualnej sesji lub połączeniu z bazą danych. Dopasowując adres sesji między v$transaction
i v$session
widoków, możemy znaleźć aktualnie uruchomiony identyfikator transakcji podany przez xid
kolumna w v$transaction
widok.
Ponieważ xid
kolumna jest typu RAW
, używamy RAWTOHEX
aby przekonwertować wartość binarną identyfikatora transakcji na jego reprezentację szesnastkową.
Serwer SQL
Używając SQL Server, wystarczy wykonać następujące zapytanie SQL:
SELECT CONVERT(VARCHAR, CURRENT_TRANSACTION_ID())
Ponieważ CURRENT_TRANSACTION_ID
funkcja zwraca BIGINT
wartość kolumny, używamy CONVERT
aby uzyskać jego reprezentację w postaci ciągu.
PostgreSQL
Korzystając z serwera PostgreSQL, możesz wykonać następujące zapytanie SQL, aby uzyskać bieżący identyfikator transakcji:
SELECT CAST(txid_current() AS text)
Ponieważ txid_current
funkcja zwraca BIGINT
wartość kolumny, używamy CAST
aby uzyskać jego reprezentację w postaci ciągu.
MySQL i MariaDB
Korzystając z MySQL lub MariaDB, możesz wykonać następujące zapytanie SQL, aby uzyskać bieżący identyfikator transakcji:
SELECT tx.trx_id
FROM information_schema.innodb_trx tx
WHERE tx.trx_mysql_thread_id = connection_id()
innodb_trx
widok w information_schema
Katalog zawiera informacje o aktualnie realizowanych transakcjach bazy danych. Ponieważ w naszym systemie może być uruchomionych wiele transakcji, musimy filtrować wiersze transakcji, dopasowując identyfikator sesji lub połączenia z bazą danych do aktualnie uruchomionej sesji.
HSQLDB
Korzystając z bazy danych HyperSQL, możesz wykonać następujące zapytanie SQL, aby uzyskać bieżący identyfikator transakcji:
VALUES (TRANSACTION_ID())
Logowanie identyfikatora transakcji za pomocą MDC
Identyfikator transakcji jest przydatny do logowania, ponieważ pozwala nam zagregować wszystkie akcje, które zostały wykonane w kontekście danej transakcji bazy danych.
Zakładając, że umieściliśmy powyższe zapytania SQL w transactionId
metody, moglibyśmy wyodrębnić bieżący identyfikator transakcji i przekazać go do frameworka Logger jako zmienną MDC.
Tak więc dla SLF4J możesz użyć put
jak pokazano na poniższym przykładzie:
MDC.put("txId", String.format(" TxId: [%s]", transactionId(entityManager)));
MDC (zmapowany kontekst diagnostyczny)
służy do rejestrowania tego, co ThreadLocal
jest do wątków Java. Zasadniczo MDC umożliwia rejestrowanie par klucz/wartość, które są ograniczone do aktualnie działającego wątku i do których można się odwoływać, gdy platforma rejestrowania tworzy komunikaty dziennika.
Aby wydrukować zmienną dziennika „txId” w dzienniku, musimy uwzględnić tę zmienną we wzorcu dołączającym dziennik:
<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}
wzorzec jest używany do odwoływania się do txId
zmienna dziennika.