Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment obtenir l'identifiant de transaction de la base de données actuelle à l'aide de JDBC ou d'Hibernate ?

Oracle

Lorsque vous utilisez Oracle, vous devez exécuter la requête SQL suivante :

SELECT RAWTOHEX(tx.xid)
FROM v$transaction tx
JOIN v$session s ON tx.ses_addr = s.saddr

La v$transaction view fournit des informations sur les transactions de base de données en cours d'exécution. Cependant, il peut y avoir plusieurs transactions en cours d'exécution dans notre système, et c'est pourquoi nous rejoignons la v$transaction avec la v$session vue.

La v$session view offre des informations sur notre session actuelle ou notre connexion à la base de données. En faisant correspondre l'adresse de session entre le v$transaction et v$session vues, nous pouvons trouver l'identifiant de transaction en cours d'exécution donné par le xid colonne dans la v$transaction vue.

Parce que le xid la colonne est de type RAW , nous utilisons RAWTOHEX pour convertir la valeur binaire de l'identifiant de transaction en sa représentation hexadécimale.

SQL Server

Lorsque vous utilisez SQL Server, il vous suffit d'exécuter la requête SQL suivante :

SELECT CONVERT(VARCHAR, CURRENT_TRANSACTION_ID())

Parce que le CURRENT_TRANSACTION_ID la fonction renvoie un BIGINT valeur de la colonne, nous utilisons CONVERT pour obtenir sa représentation String.

PostgreSQL

Lorsque vous utilisez PostgreSQL Server, vous pouvez exécuter la requête SQL suivante pour obtenir l'ID de transaction actuel :

SELECT CAST(txid_current() AS text)

Parce que le txid_current la fonction renvoie un BIGINT valeur de la colonne, nous utilisons CAST pour obtenir sa représentation String.

MySQL et MariaDB

Lorsque vous utilisez MySQL ou MariaDB, vous pouvez exécuter la requête SQL suivante pour obtenir l'identifiant de transaction actuel :

SELECT tx.trx_id
FROM information_schema.innodb_trx tx
WHERE tx.trx_mysql_thread_id = connection_id()

Le innodb_trx afficher dans le information_schema catalog fournit des informations sur les transactions de base de données en cours d'exécution. Puisqu'il peut y avoir plusieurs transactions en cours d'exécution dans notre système, nous devons filtrer les lignes de transaction en faisant correspondre la session ou l'identifiant de connexion à la base de données avec la session en cours d'exécution.

HSQLDB

Lorsque vous utilisez la base de données HyperSQL, vous pouvez exécuter la requête SQL suivante pour obtenir l'identifiant de transaction actuel :

VALUES (TRANSACTION_ID())

Enregistrement de l'identifiant de transaction à l'aide de MDC

L'identifiant de transaction est utile pour la journalisation car il nous permet d'agréger toutes les actions qui ont été exécutées dans le contexte d'une transaction de base de données donnée.

En supposant que nous ayons encapsulé les requêtes SQL ci-dessus dans un transactionId , nous pourrions extraire l'identifiant de transaction actuel et le transmettre au framework Logger en tant que variable MDC.

Ainsi, pour SLF4J, vous pouvez utiliser le put méthode comme illustré par l'exemple suivant :

MDC.put("txId", String.format(" TxId: [%s]", transactionId(entityManager)));

MDC (Mapped Diagnostic Context) sert à enregistrer ce que ThreadLocal est aux threads Java. Fondamentalement, MDC vous permet d'enregistrer des paires clé/valeur qui sont confinées au thread en cours d'exécution et que vous pouvez référencer lorsque l'infrastructure de journalisation crée des messages de journal.

Pour imprimer la variable de journal "txId" dans le journal, nous devons inclure cette variable dans le modèle d'ajout de journal :

<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>

Le %X{txId} pattern est utilisé pour référencer le txId variable de journal.