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.