sql >> Database >  >> RDS >> Mysql

Hoe krijg ik de huidige databasetransactie-ID met JDBC of Hibernate?

Oracle

Als u Oracle gebruikt, moet u de volgende SQL-query uitvoeren:

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

De v$transaction view biedt informatie over de momenteel lopende databasetransacties. Er kunnen echter meerdere transacties in ons systeem worden uitgevoerd en daarom doen we mee aan de v$transaction met de v$session bekijken.

De v$session view biedt informatie over onze huidige sessie of databaseverbinding. Door het sessie-adres te matchen tussen de v$transaction en v$session weergaven, kunnen we de huidige lopende transactie-ID vinden die wordt gegeven door de xid kolom in de v$transaction bekijken.

Omdat de xid kolom is van het type RAW , we gebruiken RAWTOHEX om de binaire waarde van de transactie-ID om te zetten in zijn hexadecimale weergave.

SQL-server

Als u SQL Server gebruikt, hoeft u alleen maar de volgende SQL-query uit te voeren:

SELECT CONVERT(VARCHAR, CURRENT_TRANSACTION_ID())

Omdat de CURRENT_TRANSACTION_ID functie retourneert een BIGINT kolomwaarde gebruiken we CONVERT om zijn String-representatie te krijgen.

PostgreSQL

Als u PostgreSQL Server gebruikt, kunt u de volgende SQL-query uitvoeren om de huidige transactie-ID te krijgen:

SELECT CAST(txid_current() AS text)

Omdat de txid_current functie retourneert een BIGINT kolomwaarde, we gebruiken CAST om zijn String-representatie te krijgen.

MySQL en MariaDB

Wanneer u MySQL of MariaDB gebruikt, kunt u de volgende SQL-query uitvoeren om de huidige transactie-ID te krijgen:

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

De innodb_trx bekijken in het information_schema catalogus biedt informatie over de momenteel lopende databasetransacties. Aangezien er meerdere transacties in ons systeem kunnen worden uitgevoerd, moeten we de transactierijen filteren door de sessie- of databaseverbindingsidentificatie te matchen met de momenteel lopende sessie.

HSQLDB

Wanneer u de HyperSQL-database gebruikt, kunt u de volgende SQL-query uitvoeren om de huidige transactie-ID te krijgen:

VALUES (TRANSACTION_ID())

De transactie-ID loggen met MDC

De transactie-ID is handig voor het loggen omdat het ons in staat stelt om alle acties te aggregeren die zijn uitgevoerd in de context van een bepaalde databasetransactie.

Ervan uitgaande dat we de bovenstaande SQL-query's hebben ingekapseld in een transactionId methode, kunnen we de huidige transactie-ID extraheren en doorgeven aan het Logger-framework als een MDC-variabele.

Dus voor SLF4J kun je de put . gebruiken methode zoals geïllustreerd door het volgende voorbeeld:

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

MDC (in kaart gebrachte diagnostische context) is voor het loggen van wat ThreadLocal is naar Java-threads. Kortom, met MDC kunt u sleutel/waarde-paren registreren die beperkt zijn tot de huidige thread en waarnaar u kunt verwijzen wanneer het logging-framework logberichten bouwt.

Om de logvariabele "txId" naar het logbestand af te drukken, moeten we deze variabele opnemen in het log-appenderpatroon:

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

De %X{txId} patroon wordt gebruikt om te verwijzen naar de txId log variabele.




  1. Wat is de reden / het nut om het ENABLE-sleutelwoord te gebruiken in Oracle-database-instructies?

  2. Hoe Div() werkt in PostgreSQL

  3. Hoe 5 willekeurige getallen te genereren in de mysql-opgeslagen procedure?

  4. Hoe kan ik invoegen in een BLOB-kolom vanuit een insert-instructie in sqldeveloper?