Оракул
Когато използвате Oracle, трябва да изпълните следната SQL заявка:
SELECT RAWTOHEX(tx.xid)
FROM v$transaction tx
JOIN v$session s ON tx.ses_addr = s.saddr
v$transaction
view предоставя информация за текущо изпълняваните транзакции на база данни. Въпреки това, в нашата система може да се изпълняват множество транзакции и затова се присъединяваме към v$transaction
с v$session
преглед.
v$session
view предлага информация за нашата текуща сесия или връзка с база данни. Чрез съпоставяне на адреса на сесията между v$transaction
и v$session
изгледи, можем да намерим текущия идентификатор на текущата транзакция, даден от xid
колона в v$transaction
преглед.
Тъй като xid
колоната е от тип RAW
, ние използваме RAWTOHEX
за да преобразувате двоичната стойност на идентификатора на транзакцията в шестнадесетичното й представяне.
SQL сървър
Когато използвате SQL Server, просто трябва да изпълните следната SQL заявка:
SELECT CONVERT(VARCHAR, CURRENT_TRANSACTION_ID())
Тъй като CURRENT_TRANSACTION_ID
функцията връща BIGINT
стойност на колоната, ние използваме CONVERT
за да получите неговото низово представяне.
PostgreSQL
Когато използвате PostgreSQL Server, можете да изпълните следната SQL заявка, за да получите текущия идентификатор на транзакцията:
SELECT CAST(txid_current() AS text)
Тъй като txid_current
функцията връща BIGINT
стойност на колоната, ние използваме CAST
за да получите неговото низово представяне.
MySQL и MariaDB
Когато използвате MySQL или MariaDB, можете да изпълните следната SQL заявка, за да получите текущия идентификатор на транзакцията:
SELECT tx.trx_id
FROM information_schema.innodb_trx tx
WHERE tx.trx_mysql_thread_id = connection_id()
innodb_trx
преглед в information_schema
каталог предоставя информация за текущо изпълняваните транзакции на база данни. Тъй като в нашата система може да има множество транзакции, трябва да филтрираме редовете за транзакции, като съпоставим идентификатора на връзката на сесията или базата данни с текущата сесия.
HSQLDB
Когато използвате базата данни HyperSQL, можете да изпълните следната SQL заявка, за да получите текущия идентификатор на транзакцията:
VALUES (TRANSACTION_ID())
Регистриране на идентификатора на транзакцията чрез MDC
Идентификаторът на транзакцията е полезен за регистриране, тъй като ни позволява да обобщим всички действия, които са били изпълнени в контекста на дадена транзакция в базата данни.
Ако приемем, че сме капсулирали SQL заявките по-горе в transactionId
метод, можем да извлечем текущия идентификатор на транзакцията и да го предадем на рамката на Logger като MDC променлива.
Така че за SLF4J можете да използвате put
метод, както е илюстрирано от следния пример:
MDC.put("txId", String.format(" TxId: [%s]", transactionId(entityManager)));
MDC (картографиран диагностичен контекст)
е за регистриране на това, което ThreadLocal
е към нишките на Java. По принцип MDC ви позволява да регистрирате двойки ключ/стойност, които са ограничени до текущата нишка и които можете да препратите, когато рамката за регистриране изгражда регистрационни съобщения.
За да отпечатате регистрационната променлива "txId" в дневника, трябва да включим тази променлива в шаблона за добавяне на дневник:
<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}
шаблонът се използва за препратка към txId
log променлива.