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開発ガイド』のロックフリー予約の使用を参照してください。
- MicroTxクライアント・ライブラリのプロパティ値を設定します。ロックフリー予約を有効にするには、Spring-RESTベースのアプリケーションのspring.microtx.lra.lock-free-reservation-activeプロパティまたはMicronautアプリケーションのmicrotx.lra.lock-free-reservation-activeプロパティにtrueを設定する必要があります。その他のライブラリ・プロパティの詳細は、「JavaアプリケーションのMicroTxライブラリ・プロパティの構成」を参照してください。
- com.oracle.microtx.lra.lockfreeパッケージをインポートします。- import com.oracle.microtx.lra.lockfree;
- アプリケーション・ロジックがトランザクションを開始または結合する前に、アプリケーション・コードにMicroTxLockFreeReservationクラスのインスタンスを注入することで、MicroTxロックフリーAPI抽象化を利用します。MicroTxLockFreeReservationクラスはLockFreeReservationインタフェースを実装します。- Spring-RESTベースのアプリケーションの場合は、次のコード行を追加します。 @Autowired private MicroTxLockFreeReservation microTxLockFreeReservation;
- Micronautアプリケーションの場合は、次のコード行を追加します。 @Inject private MicroTxLockFreeReservation microTxLockFreeReservation;
 
- Spring-RESTベースのアプリケーションの場合は、次のコード行を追加します。 
- トランザクションを開始するアプリケーションのコードを変更して、トランザクション境界を設定し、トランザクションを開始します。microTxLockFreeReservation.begin(connection); ... // Business logic to begin a transaction.ここで、 connectionは、アプリケーションがアプリケーション・データの読取りおよびOracle Databaseへの書込みに使用するデータベース接続の名前です。
- トランザクションに参加するアプリケーションのコードを変更して、トランザクション境界を設定し、トランザクションを結合します。microTxLockFreeReservation.join(connection); ... // Business logic to join an existing transaction.ここで、 connectionは、アプリケーションがアプリケーション・データの読取りおよびOracle Databaseへの書込みに使用するデータベース接続の名前です。
- ビジネス・ロジックに基づいて、トランザクションを完了または補正します。
                        - トランザクションを完了するには: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のロックフリー予約機能を活用できます。
                  
親トピック: SagaでのJavaアプリケーションの開発