sql >> Databasteknik >  >> RDS >> Mysql

Hur får man det aktuella databastransaktions-ID med JDBC eller Hibernate?

Oracle

När du använder Oracle måste du köra följande SQL-fråga:

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

v$transaction vyn ger information om de aktuella databastransaktionerna. Det kan dock finnas flera transaktioner som körs i vårt system, och det är därför vi går med i v$transaction med v$session visa.

v$session view erbjuder information om vår nuvarande session eller databasanslutning. Genom att matcha sessionsadressen mellan v$transaction och v$session visningar kan vi hitta den aktuella transaktionsidentifieraren som ges av xid kolumnen i v$transaction visa.

Eftersom xid kolumnen är av typen RAW , vi använder RAWTOHEX för att konvertera transaktionsidentifierarens binära värde till dess hexadecimala representation.

SQL-server

När du använder SQL Server behöver du bara köra följande SQL-fråga:

SELECT CONVERT(VARCHAR, CURRENT_TRANSACTION_ID())

Eftersom CURRENT_TRANSACTION_ID funktion returnerar en BIGINT kolumnvärde använder vi CONVERT för att få dess strängrepresentation.

PostgreSQL

När du använder PostgreSQL Server kan du köra följande SQL-fråga för att få det aktuella transaktions-id:

SELECT CAST(txid_current() AS text)

Eftersom txid_current funktion returnerar en BIGINT kolumnvärde använder vi CAST för att få dess strängrepresentation.

MySQL och MariaDB

När du använder MySQL eller MariaDB kan du köra följande SQL-fråga för att få det aktuella transaktions-id:

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

innodb_trx visa i information_schema katalogen ger information om de för närvarande pågående databastransaktionerna. Eftersom det kan finnas flera transaktioner som körs i vårt system måste vi filtrera transaktionsraderna genom att matcha sessionens eller databasanslutningsidentifieraren med den session som körs för närvarande.

HSQLDB

När du använder HyperSQL-databasen kan du köra följande SQL-fråga för att få det aktuella transaktions-id:

VALUES (TRANSACTION_ID())

Loggar transaktions-id med MDC

Transaktions-id:t är användbart för loggning eftersom det tillåter oss att aggregera alla åtgärder som utfördes i samband med en given databastransaktion.

Förutsatt att vi har kapslat in SQL-frågorna ovan i ett transactionId metod, kunde vi extrahera det aktuella transaktions-id:t och skicka det till Logger-ramverket som en MDC-variabel.

Så för SLF4J kan du använda put metod som illustreras av följande exempel:

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

MDC (Mapped Diagnostic Context) är för att logga vad ThreadLocal är till Java-trådar. I grund och botten låter MDC dig registrera nyckel/värdepar som är begränsade till den aktuella tråden och som du kan referera till när loggningsramverket bygger loggmeddelanden.

För att skriva ut loggvariabeln "txId" till loggen måste vi inkludera denna variabel i loggbifogningsmönstret:

<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önstret används för att referera till txId log variabel.




  1. Ansluter till RDS-databas från node.js

  2. Räkna antalet rader som innehåller samma värde

  3. vilken jdbc-burk man ska använda med Oracle 11g &jdk 1.6 och hur man ansluter till själva db:n

  4. Få förfrågan tillbaka från PDO-förberedd uttalande