Orakel
Bei Verwendung von Oracle müssen Sie die folgende SQL-Abfrage ausführen:
SELECT RAWTOHEX(tx.xid)
FROM v$transaction tx
JOIN v$session s ON tx.ses_addr = s.saddr
Die v$transaction
view gibt Auskunft über die aktuell laufenden Datenbanktransaktionen. In unserem System können jedoch mehrere Transaktionen ausgeführt werden, und deshalb schließen wir uns der v$transaction
an mit der v$session
ansehen.
Die v$session
view bietet Informationen über unsere aktuelle Sitzung oder Datenbankverbindung. Durch Abgleich der Sitzungsadresse zwischen v$transaction
und v$session
Ansichten finden wir die aktuell laufende Transaktionskennung, die durch xid
angegeben wird Spalte in der v$transaction
ansehen.
Da die xid
Spalte ist vom Typ RAW
verwenden wir RAWTOHEX
um den binären Wert der Transaktionskennung in seine hexadezimale Darstellung umzuwandeln.
SQL-Server
Wenn Sie SQL Server verwenden, müssen Sie nur die folgende SQL-Abfrage ausführen:
SELECT CONVERT(VARCHAR, CURRENT_TRANSACTION_ID())
Da die CURRENT_TRANSACTION_ID
Funktion gibt ein BIGINT
zurück Spaltenwert verwenden wir CONVERT
um seine String-Darstellung zu erhalten.
PostgreSQL
Wenn Sie PostgreSQL Server verwenden, können Sie die folgende SQL-Abfrage ausführen, um die aktuelle Transaktions-ID abzurufen:
SELECT CAST(txid_current() AS text)
Da die txid_current
Funktion gibt ein BIGINT
zurück Spaltenwert verwenden wir CAST
um seine String-Darstellung zu erhalten.
MySQL und MariaDB
Wenn Sie MySQL oder MariaDB verwenden, können Sie die folgende SQL-Abfrage ausführen, um die aktuelle Transaktions-ID zu erhalten:
SELECT tx.trx_id
FROM information_schema.innodb_trx tx
WHERE tx.trx_mysql_thread_id = connection_id()
Die innodb_trx
Ansicht im information_schema
catalog gibt Auskunft über die aktuell laufenden Datenbanktransaktionen. Da in unserem System mehrere Transaktionen ausgeführt werden können, müssen wir die Transaktionszeilen filtern, indem wir die Sitzungs- oder Datenbankverbindungskennung mit der aktuell ausgeführten Sitzung abgleichen.
HSQLDB
Wenn Sie die HyperSQL-Datenbank verwenden, können Sie die folgende SQL-Abfrage ausführen, um die aktuelle Transaktions-ID zu erhalten:
VALUES (TRANSACTION_ID())
Protokollieren der Transaktions-ID mit MDC
Die Transaktions-ID ist für die Protokollierung nützlich, da sie es uns ermöglicht, alle Aktionen zusammenzufassen, die im Kontext einer bestimmten Datenbanktransaktion ausgeführt wurden.
Angenommen, wir haben die obigen SQL-Abfragen in eine transactionId
gekapselt
-Methode könnten wir die aktuelle Transaktions-ID extrahieren und sie als MDC-Variable an das Logger-Framework übergeben.
Für SLF4J können Sie also den put
verwenden Methode wie im folgenden Beispiel veranschaulicht:
MDC.put("txId", String.format(" TxId: [%s]", transactionId(entityManager)));
MDC (zugeordneter Diagnosekontext)
ist für die Protokollierung was ThreadLocal
ist zu Java-Threads. Grundsätzlich ermöglicht Ihnen MDC, Schlüssel/Wert-Paare zu registrieren, die auf den aktuell ausgeführten Thread beschränkt sind und auf die Sie verweisen können, wenn das Protokollierungsframework Protokollnachrichten erstellt.
Um die Protokollvariable „txId“ in das Protokoll zu drucken, müssen wir diese Variable in das Protokoll-Appender-Muster aufnehmen:
<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>
Der %X{txId}
Muster wird verwendet, um auf die txId
zu verweisen log-Variable.