Оракул
Когато използвате 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 променлива.