Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie erhalte ich die aktuelle Datenbanktransaktions-ID mit JDBC oder Hibernate?

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.