Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak uzyskać aktualny identyfikator transakcji bazy danych za pomocą JDBC lub Hibernate?

Wyrocznia

Korzystając z Oracle, musisz wykonać następujące zapytanie SQL:

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

v$transaction widok zawiera informacje o aktualnie uruchomionych transakcjach bazy danych. Jednak w naszym systemie może być uruchomionych wiele transakcji, dlatego dołączamy do v$transaction z v$session widok.

v$session wyświetl oferty informacje o naszej aktualnej sesji lub połączeniu z bazą danych. Dopasowując adres sesji między v$transaction i v$session widoków, możemy znaleźć aktualnie uruchomiony identyfikator transakcji podany przez xid kolumna w v$transaction widok.

Ponieważ xid kolumna jest typu RAW , używamy RAWTOHEX aby przekonwertować wartość binarną identyfikatora transakcji na jego reprezentację szesnastkową.

Serwer SQL

Używając SQL Server, wystarczy wykonać następujące zapytanie SQL:

SELECT CONVERT(VARCHAR, CURRENT_TRANSACTION_ID())

Ponieważ CURRENT_TRANSACTION_ID funkcja zwraca BIGINT wartość kolumny, używamy CONVERT aby uzyskać jego reprezentację w postaci ciągu.

PostgreSQL

Korzystając z serwera PostgreSQL, możesz wykonać następujące zapytanie SQL, aby uzyskać bieżący identyfikator transakcji:

SELECT CAST(txid_current() AS text)

Ponieważ txid_current funkcja zwraca BIGINT wartość kolumny, używamy CAST aby uzyskać jego reprezentację w postaci ciągu.

MySQL i MariaDB

Korzystając z MySQL lub MariaDB, możesz wykonać następujące zapytanie SQL, aby uzyskać bieżący identyfikator transakcji:

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

innodb_trx widok w information_schema Katalog zawiera informacje o aktualnie realizowanych transakcjach bazy danych. Ponieważ w naszym systemie może być uruchomionych wiele transakcji, musimy filtrować wiersze transakcji, dopasowując identyfikator sesji lub połączenia z bazą danych do aktualnie uruchomionej sesji.

HSQLDB

Korzystając z bazy danych HyperSQL, możesz wykonać następujące zapytanie SQL, aby uzyskać bieżący identyfikator transakcji:

VALUES (TRANSACTION_ID())

Logowanie identyfikatora transakcji za pomocą MDC

Identyfikator transakcji jest przydatny do logowania, ponieważ pozwala nam zagregować wszystkie akcje, które zostały wykonane w kontekście danej transakcji bazy danych.

Zakładając, że umieściliśmy powyższe zapytania SQL w transactionId metody, moglibyśmy wyodrębnić bieżący identyfikator transakcji i przekazać go do frameworka Logger jako zmienną MDC.

Tak więc dla SLF4J możesz użyć put jak pokazano na poniższym przykładzie:

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

MDC (zmapowany kontekst diagnostyczny) służy do rejestrowania tego, co ThreadLocal jest do wątków Java. Zasadniczo MDC umożliwia rejestrowanie par klucz/wartość, które są ograniczone do aktualnie działającego wątku i do których można się odwoływać, gdy platforma rejestrowania tworzy komunikaty dziennika.

Aby wydrukować zmienną dziennika „txId” w dzienniku, musimy uwzględnić tę zmienną we wzorcu dołączającym dziennik:

<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} wzorzec jest używany do odwoływania się do txId zmienna dziennika.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL SHA() nie działa

  2. MySQL Znajdź całkowitą liczbę postów na użytkownika

  3. Mysql NIE W I NIE ISTNIEJE tak samo?

  4. Klauzula SQL IN - odzyskaj elementy IN, które się nie zgadzają

  5. SQL:Jak wykonać ciąg znaków nie jest równy