sql >> Database teknologi >  >> RDS >> Mysql

Hvordan får man det aktuelle databasetransaktions-id ved hjælp af JDBC eller Hibernate?

Oracle

Når du bruger Oracle, skal du udføre følgende SQL-forespørgsel:

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

v$transaction visningen giver information om de aktuelle databasetransaktioner. Der kan dog være flere transaktioner, der kører i vores system, og det er derfor, vi tilslutter os v$transaction med v$session se.

v$session view tilbyder information om vores aktuelle session eller databaseforbindelse. Ved at matche sessionsadressen mellem v$transaction og v$session visninger, kan vi finde den aktuelle kørende transaktions-id givet af xid kolonnen i v$transaction se.

Fordi xid kolonnen er af typen RAW , vi bruger RAWTOHEX at konvertere transaktionsidentifikatorens binære værdi til dens hexadecimale repræsentation.

SQL-server

Når du bruger SQL Server, skal du blot udføre følgende SQL-forespørgsel:

SELECT CONVERT(VARCHAR, CURRENT_TRANSACTION_ID())

Fordi CURRENT_TRANSACTION_ID funktion returnerer en BIGINT kolonneværdi, bruger vi CONVERT for at få dens String-repræsentation.

PostgreSQL

Når du bruger PostgreSQL Server, kan du udføre følgende SQL-forespørgsel for at få det aktuelle transaktions-id:

SELECT CAST(txid_current() AS text)

Fordi txid_current funktion returnerer en BIGINT kolonneværdi, bruger vi CAST for at få dens String-repræsentation.

MySQL og MariaDB

Når du bruger MySQL eller MariaDB, kan du udføre følgende SQL-forespørgsel for at få det aktuelle transaktions-id:

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

innodb_trx se i information_schema katalog giver information om de aktuelle databasetransaktioner. Da der kan køre flere transaktioner i vores system, er vi nødt til at filtrere transaktionsrækkerne ved at matche sessions- eller databaseforbindelses-id'et med den aktuelle session.

HSQLDB

Når du bruger HyperSQL-databasen, kan du udføre følgende SQL-forespørgsel for at få det aktuelle transaktions-id:

VALUES (TRANSACTION_ID())

Logføring af transaktions-id ved hjælp af MDC

Transaktions-id'et er nyttigt til logning, fordi det giver os mulighed for at aggregere alle handlinger, der blev udført i forbindelse med en given databasetransaktion.

Forudsat at vi har indkapslet SQL-forespørgslerne ovenfor i et transactionId metode, kunne vi udtrække det aktuelle transaktions-id og videregive det til Logger-rammeværket som en MDC-variabel.

Så for SLF4J kan du bruge put metode som illustreret af følgende eksempel:

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

MDC (Mapped Diagnostic Context) er til at logge hvad ThreadLocal er til Java-tråde. Grundlæggende giver MDC dig mulighed for at registrere nøgle/værdi-par, der er begrænset til den aktuelt kørende tråd, og som du kan referere til, når logningsrammen opbygger logmeddelelser.

For at udskrive "txId"-logvariablen til loggen, skal vi inkludere denne variabel i logappender-mønsteret:

<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} mønster bruges til at referere til txId log variabel.




  1. LISTAGG-forespørgsel ORA-00937:ikke en enkeltgruppegruppefunktion

  2. PHP udarbejdede erklæringer og transaktioner i en løkke

  3. Beregn fortjeneste baseret på First-In, First-Out-priser

  4. Hvordan beregner man summen af ​​to kolonner fra to forskellige tabeller uden hvor-klausul?