6.4 XAトランザクションの管理

6.4.1 トランザクション・タイムアウトの設定

XA参加側サービスから送信されたリクエストがアクティブである期間を指定します。トランザクションのコミットまたはロールバックが指定した期間内に行われないと、トランザクションはロールバックされます。

この値は、トランザクション・イニシエータ・アプリケーションのみに指定します。この値を参加側アプリケーションに指定しても無視されます。

参加側サービスから送信されるリクエストのトランザクション・タイムアウトを設定するには:

  1. MicroTxvalues.yamlファイルのtxMaxTimeoutパラメータに、トランザクションがアクティブなままである最大時間(ミリ秒)を指定します。デフォルト値は60000 msです。
    MicroTxvalues.yamlファイルは、installation_directory/otmm-RELEASE/otmm/helmchartsフォルダにあります。
  2. トランザクション・イニシエータ・サービスのtmm.propertiesファイル内のORACLE_TMM_TRANSACTION_TIMEOUTパラメータで、トランザクションをアクティブにしておく最長期間(ミリ秒)を指定します。トランザクションのコミットまたはロールバックが指定した期間内に行われないと、トランザクションはロールバックされます。デフォルト値(最小値)は60000です。
ORACLE_TMM_TRANSACTION_TIMEOUTの値はtxMaxTimeoutの値をオーバーライドできますが、txMaxTimeoutの値を超えることはできません。たとえば、txMaxTimeoutの値が70000で、ORACLE_TMM_TRANSACTION_TIMEOUTの値が80000の場合、最長タイムアウトは70000ミリ秒に設定されます。txMaxTimeoutの値が90000で、ORACLE_TMM_TRANSACTION_TIMEOUTの値が80000の場合、最長タイムアウトは80000ミリ秒に設定されます。

6.4.2 グローバルおよびローカル・トランザクションについて

トランザクション・イニシエータ・サービスがXAトランザクションを開始するためにMicroTxをコールすると、デフォルトでは、このトランザクションはグローバル・トランザクションとして処理されます。

グローバル・トランザクションは、GTRIDに関連付けられているトランザクションです。たとえば、複数のマイクロサービスにわたるトランザクションや、単一のマイクロサービスが複数のリソース・マネージャと対話するトランザクションなどです。

ローカル・トランザクションは、GTRIDに関連付けられていないトランザクションです。たとえば、トランザクションに含まれる単一のサービスが単一のリソース・マネージャと対話する場合などです。このようなトランザクションは、このトランザクションを管理するためにコーディネータを必要としないため、ローカルで処理できます。MicroTxクライアント・ライブラリは、ローカル・トランザクションを管理します。MicroTxコーディネータを使用せずにトランザクションをローカルで処理すると、パフォーマンスが向上します。ローカル・トランザクションによって時間が節約され、スループットが向上します。

6.4.2.1 トランザクション・プロモーションについて

トランザクション・プロモーション機能を有効にすると、すべてのトランザクションがローカル・トランザクションとして開始されます。

ノート:

この機能は、Oracle Databaseでのみ使用できます。

一部のトランザクションはローカルで処理され、グローバル・トランザクションとしてプロモートされません。たとえば、トランザクション・イニシエータ・サービスが1つのリソース・マネージャのみと対話し、外部サービスと通信しない場合、トランザクションはローカルで処理されます。

次のトランザクションは、ローカルで処理できないため、グローバル・トランザクションとしてプロモートされます。

  • トランザクション・イニシエータ・サービスが複数のリソース・マネージャと通信する場合。
  • 複数のサービスがリソース・マネージャとともにトランザクションに参加する場合。

トランザクションがグローバル・トランザクションとしてプロモートされると、サービスはMicroTxコーディネータに登録され、コーディネータはトランザクションを処理します。

6.4.2.2 トランザクション・プロモーションの有効化

デフォルトでは、すべてのトランザクションがグローバル・トランザクションID (GTRID)に関連付けられ、グローバル・トランザクションとして処理されます。パフォーマンスを向上させるには、トランザクション・プロモーションを有効にして特定のトランザクションを管理します。

ノート:

この機能は、Oracle Databaseでのみ使用できます。
トランザクション・プロモーションを有効にするには:
  • イニシエータ・サービスのtmm.propertiesファイルで、oracle.tmm.promotableプロパティをtrueに設定します。トランザクション・プロモーションを有効にした場合、ローカルで処理できるトランザクションは、コーディネータを使用せずに管理されます。

    デフォルト値はfalseです。oracle.tmm.promotableプロパティの値をfalseに設定すると、すべてのトランザクションがデフォルトでグローバル・トランザクションとして開始され、GTRIDに関連付けられます。ローカル・トランザクションは開始されません。

6.4.3 XAトランザクション通知の受信の登録

トランザクション・イニシエータ・サービスおよび参加側サービスを登録して、通知を受信できます。MicroTxは、イベントの発生時(準備フェーズの前およびMicroTxがトランザクションを正常にコミットまたはロールバックしたとき)に、登録したサービスについて通知します。

MicroTxコーディネータが、登録したサービスについて通知します。イベントの発生時にビジネス・ロジックに基づいてサービスが追加のタスクを実行するようにする場合には、サービスの登録をお薦めします。登録するリソースごとに、コールバック・リソースを作成し、2つのメソッドを宣言する必要があります(MicroTxが、イベント発生時に通知を送信するためにこれらをコールします)。

ノート:

この機能は、Javaサービスでのみ使用可能です。
イベント通知を受信するために登録するトランザクション参加側サービスおよびイニシエータ・サービスに対して、次のタスクを実行します。
  1. アプリケーション・コード内に、コールバック・リソースを作成するコードを追加します(イベント発生時にMicroTxコーディネータがこれをコールします)。

    2つのメソッドを含むJAX-RSクラスを作成します。beforeCompletionメソッドおよびafterCompletionメソッドの宣言は必須です。これらのメソッド内に、アプリケーションのビジネス・ロジックに固有のコードを指定します。MicroTxコーディネータはbeforeCompletionメソッドをコールしてから、参加側に準備させるリクエストを送信します。afterCompletionメソッドは、トランザクションの完了後にイベントの最終ステータスを返します。ステータスは、STATUS_COMMITTEDまたはSTATUS_ROLLEDBACKです。

    次のサンプル・コードでは、EventListenerResourceがJAX-RSクラスの名前、transaction-syncはコールバック・リソースの名前です。クラスおよびコールバック・リソースには任意の名前を指定できます。後で指定する必要があるため、このリソースの名前を書き留めてください。

    サンプル・コード

    @Path("transaction-sync")
    public class EventListenerResource {
         
        /**
        * The MicroTx coordinator calls the beforeCompletion method before 
        * the two-phase transaction commit process starts. This call is executed with
        * the transaction  context of the transaction that is being committed.
        **/
        @POST
        @Path("/{gtrid}/beforecompletion")
        @Produces(MediaType.APPLICATION_JSON)
        public Response beforeCompletion(@PathParam("gtrid") String gtrid) {
            ...
            //tasks to be done before the transaction is completed 
            //enter the code based on your application's business logic
            return Response.status(Response.Status.OK).build();
        }
     
        /**
        * The MicroTx coordinator calls the afterCompletion method after the 
        * transaction is committed or rolled back.
        **/
        @POST
        @Path("/{gtrid}/aftercompletion/{status}")
        @Produces(MediaType.APPLICATION_JSON)
        public Response afterCompletion(@PathParam("gtrid") String gtrid, @PathParam("status") String status) {
           ...
           //tasks to be done after the transaction is completed 
           //enter the code based on your application's business logic
           return Response.status(Response.Status.OK).build();
        }
    }
  2. アプリケーションのビジネス・ロジックに基づいてイベント通知を受信するためにイニシエータ・サービスを登録します。

    次のサンプル・コードで、TrmRegisterSynchronization.register()メソッドをコールするのは、begin()をコールした後で、commit()またはrollback()をコールする前であることが示されます。TrmRegisterSynchronization.register()メソッドをコールする際には、前のステップで作成したコールバック・リソースの名前を渡す必要があります。

    サンプル・コード

    import oracle.tmm.jta.TrmUserTransaction;
    /**
    * Initiator method which initiates the transaction
    */
    transactionMethod() {
        TrmUserTransaction transaction = new TrmUserTransaction();
        transaction.begin();
        //
        TrmRegisterSynchronization.register(transaction.getTransactionID(), "/transaction-sync");
        ...
        // code that is specific to the application's business logic
        transaction.commit();
    }

    説明

    • transaction-syncは、前のステップで作成したコールバック・リソースの名前です。ご自身の環境に基づいてこの値を置き換えてください。
    • transaction.getTransactionID()は、現在のトランザクションのGTRIDです。TrmUserTransactionクラス・オブジェクトを使用して、現在のトランザクションのGTRIDを取得します。
  3. イベント通知を受信するために1つ以上のトランザクション参加側サービスを登録します。アプリケーションのビジネス・ロジックに基づいて、アプリケーションでイベント通知を受信する必要があるかどうかを決定できます。

    次のサンプル・コードは、GTRID値および以前に作成したコールバック・リソースの名前を明示的に渡して、TrmRegisterSynchronization.register()メソッドをコールする方法を示しています。

    サンプル・コード

    import oracle.tmm.jta.TrmRegisterSynchronization;
    /**
    * Participant method which is in transaction context.
    * Transaction event registration using GTRID
    */
    participantMethod1(){
        TrmXaContext trmXaContext = ThreadLocalXaContext.get();
        if (trmXaContext != null) {
            String currentTransactionGTRID = new String(trmXaContext.trmXid.getGlobalTransactionId());
            TrmRegisterSynchronization.register(currentTransactionGTRID, "/transaction-sync");
        }
        ...
        // code that is specific to the application's business logic
    }
     

    説明

    • transaction-syncは、前に作成したコールバック・リソースの名前です。ご自身の環境に基づいてこの値を置き換えてください。
    • currentTransactionGTRIDは、現在のトランザクションのGTRIDです。ThreadLocalから現在のトランザクションのGTRIDを取得するには、TrmXaContextを使用します。これは、トランザクション・イニシエータ・サービスにも参加側サービスにも適用されます。