sql >> Databáze >  >> RDS >> Mysql

Jak získat aktuální ID transakce databáze pomocí JDBC nebo Hibernate?

Oracle

Při použití Oracle musíte provést následující SQL dotaz:

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

v$transaction pohled poskytuje informace o aktuálně probíhajících databázových transakcích. V našem systému však může probíhat více transakcí, a proto se připojujeme k v$transaction pomocí v$session zobrazit.

v$session zobrazit nabízí informace o naší aktuální relaci nebo připojení k databázi. Porovnáním adresy relace mezi v$transaction a v$session zobrazení, můžeme najít aktuálně běžící identifikátor transakce daný xid ve sloupci v$transaction zobrazit.

Protože xid sloupec je typu RAW , používáme RAWTOHEX převést binární hodnotu identifikátoru transakce na jeho hexadecimální reprezentaci.

SQL Server

Při použití SQL Serveru stačí provést následující SQL dotaz:

SELECT CONVERT(VARCHAR, CURRENT_TRANSACTION_ID())

Protože CURRENT_TRANSACTION_ID funkce vrací BIGINT hodnotu sloupce, používáme CONVERT získat jeho Řetězcovou reprezentaci.

PostgreSQL

Když používáte PostgreSQL Server, můžete spustit následující SQL dotaz pro získání aktuálního ID transakce:

SELECT CAST(txid_current() AS text)

Protože txid_current funkce vrací BIGINT hodnotu sloupce, používáme CAST získat jeho Řetězcovou reprezentaci.

MySQL a MariaDB

Když používáte MySQL nebo MariaDB, můžete spustit následující SQL dotaz, abyste získali aktuální ID transakce:

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

innodb_trx zobrazit v information_schema katalog poskytuje informace o aktuálně probíhajících databázových transakcích. Vzhledem k tomu, že v našem systému může být spuštěno více transakcí, potřebujeme filtrovat řádky transakcí tak, že se identifikátor relace nebo připojení k databázi shoduje s aktuálně běžící relací.

HSQLDB

Při použití databáze HyperSQL můžete provést následující dotaz SQL a získat aktuální ID transakce:

VALUES (TRANSACTION_ID())

Zaprotokolování ID transakce pomocí MDC

ID transakce je užitečné pro protokolování, protože nám umožňuje agregovat všechny akce, které byly provedeny v kontextu dané databázové transakce.

Za předpokladu, že jsme výše uvedené dotazy SQL zapouzdřili do transactionId metodou, mohli bychom extrahovat aktuální ID transakce a předat jej frameworku Logger jako proměnnou MDC.

Takže pro SLF4J můžete použít put způsob, jak je znázorněno na následujícím příkladu:

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

MDC (Mapped Diagnostic Context) je pro protokolování toho, co ThreadLocal je do vláken Java. MDC vám v zásadě umožňuje zaregistrovat páry klíč/hodnota, které jsou omezeny na aktuálně běžící vlákno a na které se můžete odkazovat, když protokolovací rámec vytváří zprávy protokolu.

Chcete-li vytisknout proměnnou protokolu „txId“ do protokolu, musíme tuto proměnnou zahrnout do vzoru appender protokolu:

<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} vzor se používá k odkazování na txId logovat proměnnou.




  1. Požadavek se nezdařil se stavem HTTP 401:Neautorizováno v SSRS

  2. Porovnání MySQL a Java Time

  3. Plynulé NHibernate DuplicateMappingException s automatickým mapováním

  4. Zatímco smyčka PHP get_result nefunguje