8.3.5 Sagaおよびロックフリー予約を使用するJavaアプリケーションの開発

Spring RESTおよびMicronautアプリケーションのMicroTx Sagaライブラリでは、ロックフリー予約がサポートされています。

Spring RESTベースのアプリケーションのMicroTxライブラリのリファレンス情報は、Oracle® Transaction Manager for Microservices Spring Boot APIリファレンスfor Sagaを参照してください。

マイクロサービスでリソース・マネージャとしてOracle Database 23aiのみを使用する場合、Oracle Databaseが提供するSagasを使用してトランザクションを管理できます。1つのマイクロサービスがOracle Database 23aiをリソース・マネージャとして使用し、他のマイクロサービスが他のデータベースを使用する場合、MicroTx SagaライブラリをSpring RESTおよびMicronautアプリケーションと統合して、Oracle Database 23aiのロックフリー予約機能を活用できます。

ロックフリー予約機能は、Oracle Database 23aiで導入されました。『Database開発ガイド』ロックフリー予約の使用を参照してください。

  1. MicroTxクライアント・ライブラリのプロパティ値を設定します。ロックフリー予約を有効にするには、Spring-RESTベースのアプリケーションのspring.microtx.lra.lock-free-reservation-activeプロパティまたはMicronautアプリケーションのmicrotx.lra.lock-free-reservation-activeプロパティにtrueを設定する必要があります。その他のライブラリ・プロパティの詳細は、「JavaアプリケーションのMicroTxライブラリ・プロパティの構成」を参照してください。
  2. com.oracle.microtx.lra.lockfreeパッケージをインポートします。
    import com.oracle.microtx.lra.lockfree;
  3. アプリケーション・ロジックがトランザクションを開始または結合する前に、アプリケーション・コードにMicroTxLockFreeReservationクラスのインスタンスを注入することで、MicroTxロックフリーAPI抽象化を利用します。MicroTxLockFreeReservationクラスはLockFreeReservationインタフェースを実装します。
    • Spring-RESTベースのアプリケーションの場合は、次のコード行を追加します。
      @Autowired 
      private MicroTxLockFreeReservation microTxLockFreeReservation;
    • Micronautアプリケーションの場合は、次のコード行を追加します。
      @Inject
      private MicroTxLockFreeReservation microTxLockFreeReservation;
  4. トランザクションを開始するアプリケーションのコードを変更して、トランザクション境界を設定し、トランザクションを開始します。
    microTxLockFreeReservation.begin(connection);
    ... // Business logic to begin a transaction.

    ここで、connectionは、アプリケーションがアプリケーション・データの読取りおよびOracle Databaseへの書込みに使用するデータベース接続の名前です。

  5. トランザクションに参加するアプリケーションのコードを変更して、トランザクション境界を設定し、トランザクションを結合します。
    microTxLockFreeReservation.join(connection);
    ... // Business logic to join an existing transaction.

    ここで、connectionは、アプリケーションがアプリケーション・データの読取りおよびOracle Databaseへの書込みに使用するデータベース接続の名前です。

  6. ビジネス・ロジックに基づいて、トランザクションを完了または補正します。
    • トランザクションを完了するには:
      microTxLockFreeReservation.complete(connection);
    • トランザクションを補正するには:
      microTxLockFreeReservation.compensate(connection);

    ここで、connectionは、アプリケーションがアプリケーション・データの読取りおよびOracle Databaseへの書込みに使用するデータベース接続の名前です。

次のサンプル・コードは、トランザクションに参加するSpring RESTベースのアプリケーションに対してjoin()complete()およびcompensate()を使用して、トランザクション境界を設定する方法を示しています。太字のコード行は、MicroTxライブラリを統合するために既存のアプリケーション・コードに追加されるコード行を示します。サンプル・コードは、読みやすくするために省略記号(...)を使用して一部を省いています。microtx-samples GitHubリポジトリのlra/lockfreeフォルダにサンプル・コード全体を表示できます。

import com.oracle.microtx.lra.lockfree;
...
// code specific to application's business logic
...
//Create an instance of the MicroTxLockFreeReservation class
//which implements the LockFreeReservation interface
@Autowired 
private MicroTxLockFreeReservation microTxLockFreeReservation;
...
@RequestMapping(value="/APPLICATION-URL", method = RequestMethod.POST)
@LRA(value=LRA.Type.MANDATORY, end = false)
....

// In the transaction participant application code, 
// provide business logic for the join method so that the
// participant app can join an existing transaction, that MicroTx coordinates.
microTxLockFreeReservation.join(connection);

@RequestMapping(value="/complete", method = RequestMethod.PUT)
@Complete
// application specific business logic to complete the transaction
...

//In transaction initiator and transaction participant application code, 
// provide business logic for the complete and compensate methods so that the
// that MicroTx coordinator can call these methods.
microTxLockFreeReservation.complete(connection);
...

@RequestMapping(value="/compensate", method = RequestMethod.PUT)
@Compensate
// application specific business logic to compensate the transaction
...
//
microTxLockFreeReservation.compensate(connection);
...

同様に、トランザクション・イニシエータ・アプリケーションのトランザクション境界を設定できます。唯一の変更点は、トランザクションを開始するためにbegin()メソッドをコールし、参加側アプリケーションでのみ使用されるjoin()メソッドをコールしないことです。

MicroTxライブラリを使用するサンプルSpring RESTベースのトランザクション・イニシエータ・アプリケーションのソース・コードは、microtx-samples GitHubリポジトリのtrip-manager-springbootフォルダにあります。MicroTxライブラリを使用するサンプルSpring RESTベースのトランザクション参加側アプリケーションのソース・コードは、microtx-samples GitHubリポジトリのhotel-springbootフォルダにあります。MicroTxライブラリをアプリケーションと統合する際にこれらのファイルを参照として使用し、Oracle Database 23aiのロックフリー予約機能を活用できます。