sql >> データベース >  >> RDS >> Mysql

JDBCまたはHibernateを使用して現在のデータベーストランザクションIDを取得するにはどうすればよいですか?

    Oracle

    Oracleを使用する場合は、次のSQLクエリを実行する必要があります。

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

    v$transaction ビューは、現在実行中のデータベーストランザクションに関する情報を提供します。ただし、システムで複数のトランザクションが実行されている可能性があるため、v$transactionに参加しています。 v$sessionを使用 ビュー。

    v$session ビューは、現在のセッションまたはデータベース接続に関する情報を提供します。 v$transaction間でセッションアドレスを照合する およびv$session ビューでは、xidで指定された現在実行中のトランザクション識別子を見つけることができます v$transactionの列 ビュー。

    xid 列のタイプはRAWRAWTOHEXを使用しています トランザクション識別子のバイナリ値を16進表現に変換します。

    SQL Server

    SQL Serverを使用する場合は、次のSQLクエリを実行するだけです。

    SELECT CONVERT(VARCHAR, CURRENT_TRANSACTION_ID())
    

    CURRENT_TRANSACTION_IDのため 関数はBIGINTを返します 列の値、CONVERTを使用しています 文字列表現を取得します。

    PostgreSQL

    PostgreSQLサーバーを使用する場合、次のSQLクエリを実行して、現在のトランザクションIDを取得できます。

    SELECT CAST(txid_current() AS text)
    

    txid_current 関数はBIGINTを返します 列の値、CASTを使用しています 文字列表現を取得します。

    MySQLとMariaDB

    MySQLまたはMariaDBを使用する場合、次のSQLクエリを実行して、現在のトランザクションIDを取得できます。

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

    innodb_trx information_schemaで表示 カタログは、現在実行中のデータベーストランザクションに関する情報を提供します。システムで複数のトランザクションが実行されている可能性があるため、セッションまたはデータベース接続識別子を現在実行中のセッションと照合して、トランザクション行をフィルタリングする必要があります。

    HSQLDB

    HyperSQLデータベースを使用する場合、次のSQLクエリを実行して、現在のトランザクションIDを取得できます。

    VALUES (TRANSACTION_ID())
    

    MDCを使用してトランザクションIDをログに記録する

    トランザクションIDは、特定のデータベーストランザクションのコンテキストで実行されたすべてのアクションを集約できるため、ログ記録に役立ちます。

    上記のSQLクエリを transactionIdにカプセル化したと仮定します。 メソッドでは、現在のトランザクションIDを抽出し、それをMDC変数としてLoggerフレームワークに渡すことができます。

    したがって、SLF4Jの場合、putを使用できます。 次の例に示すような方法:

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

    MDC(マップされた診断コンテキスト) ThreadLocalをログに記録するためのものです Javaスレッドに対するものです。基本的に、MDCを使用すると、現在実行中のスレッドに限定され、ロギングフレームワークがログメッセージを作成するときに参照できるキーと値のペアを登録できます。

    「txId」ログ変数をログに出力するには、この変数をログアペンダーパターンに含める必要があります。

    <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} パターンは、txIdを参照するために使用されます ログ変数。




    1. Microsoft OLE DB非推奨!ロングライブADO!

    2. 10分以内に連続したトランザクションを見つける

    3. 2列の選択で1列の重複する値を削除します

    4. SQL Server 2017(データベースエンジン)の新機能