8 XAでのアプリケーションの開発
マイクロサービス対応トランザクション・マネージャ(MicroTx)を使用してマイクロサービスのトランザクションを管理するには、既存のアプリケーション・コードにいくつか変更を加えて、MicroTxライブラリによって提供される機能を統合する必要があります。
- 開始する前に、MicroTxをインストールし、アクセスできることを確認してください。
- マイクロサービスの実装にMicroTxクライアント・ライブラリを含めます。
- CDI注釈またはMicroTxクライアント・ライブラリAPIを使用して、必要なインターセプタとコールバックを登録します。
- 参加側マイクロサービスでCDI注釈またはMicroTxクライアント・ライブラリAPIを使用して、XA準拠のリソース・マネージャとの接続を取得します。
- MicroTxクライアント・ライブラリAPIを使用して、XAトランザクションが開始したことを示すトランザクション境界を区切ってから、トランザクションをコミットまたはロールバックします。
MicroTxを使用してXAトランザクションを管理するアプリケーションを開発するには、次のワークフローをガイドとして使用します。
タスク | 説明 | 詳細 |
---|---|---|
トランザクション参加側アプリケーションのリソース・マネージャを設定します | XA準拠またはXA非準拠など、使用するリソース・マネージャのタイプを特定します。 | リソース・マネージャの計画 |
MicroTxライブラリ・プロパティの構成情報を指定します。 | すべてのトランザクション参加側アプリケーションおよびトランザクション・イニシエータ・アプリケーションに対してこのステップを実行し、アプリケーションがライブラリにアクセスできるようにします。 | ライブラリ・プロパティの構成 |
MicroTxライブラリをアプリケーション・コードと統合します。 | 次の要因に基づいて、ライブラリを統合する適切な手順を選択します:
|
アプリケーションに応じて、次のいずれかのタスクを実行します: |
アプリケーションのデプロイ | マイクロサービスの開発、テストおよびデプロイを個別に行います。アプリケーションでライブラリ・ファイルを使用してから、環境にアプリケーションをデプロイします。 | アプリケーションのデプロイ |
- リソース・マネージャの計画
この項で説明する点を考慮して、リソース・マネージャについて計画します。選択するリソース・マネージャとその使用方法に応じて、アプリケーションの構成要件は異なります。 - リソース・マネージャとしてのPostgreSQLの構成
PostgreSQLをXAトランザクションのリソース・マネージャとして使用するには、準備完了状態のトランザクションおよびセッション・アフィニティを有効にする必要があります。 - トランザクション・タイムアウトの設定
XA参加側サービスから送信されたリクエストがアクティブである期間を指定します。トランザクションのコミットまたはロールバックが指定した期間内に行われないと、トランザクションはロールバックされます。 - XAトランザクション通知の受信の登録
MicroTxリリース22.3.2以降では、トランザクション・イニシエータ・サービスおよび参加側サービスを登録して、通知を受信できます。MicroTxは、イベントの発生時(準備フェーズの前およびMicroTxがトランザクションを正常にコミットまたはロールバックしたとき)に、登録したサービスについて通知します。 - ライブラリ・プロパティの構成
すべての参加側アプリケーションとイニシエータ・アプリケーションについてMicroTxライブラリ・プロパティの構成情報を指定します。 - XAでのJavaアプリケーションの開発
JavaアプリケーションでMicroTxライブラリを使用します。 - XAでのNode.jsアプリケーションの開発
- トランザクション参加側としてのORDSアプリケーションの開発
この項では、Oracle Databaseサンプル・アプリケーションをデプロイして実行するというコンテキストで、データベース・アプリケーションをXA参加側として構成する詳しいステップを説明します。
8.1 リソース・マネージャの計画
この項で説明する点を考慮して、リソース・マネージャについて計画します。選択するリソース・マネージャとその使用方法に応じて、アプリケーションの構成要件は異なります。
- サポートされているリソース・マネージャ
トランザクション参加側サービスは、リソース・マネージャを使用してアプリケーション・データを格納できます。 - リソース・マネージャのサポートされているドライバ
使用するリソース・マネージャで機能する、正しいJDBCドライバとUCPバージョンを必要に応じて選択するのはアプリケーション開発者の責任です。 - 非XAリソースの最適化
ロギング・ラスト・リソース(LLR)またはラスト・リソース・コミット(LRC)の最適化を使用すると、1つの非XAリソースがグローバル・トランザクションに参加できるようになります。 - 複数のアプリケーションの共通リソース・マネージャ
MicroTxリリース22.3.1から、複数のトランザクション参加側サービスが単一のリソース・マネージャを使用し、トランザクションを最適化できます。 - 1つのアプリケーションでの複数のリソース・マネージャの構成
MicroTxリリース22.3.2以降では、1つの参加側サービスに対して複数のリソース・マネージャを使用できます。ビジネス・ロジックに基づいて、1つの参加側サービスは、複数のXA準拠リソース・マネージャに接続できます。ただし、1つのトランザクションで非XAリソースは1つしかサポートされません。 - XAトランザクションの動的リカバリについて
MicroTxリリース22.3.1から、トランザクション・コーディネータ・サーバーは、障害後にサーバーが再起動したときに進行中のトランザクションを再開します。
親トピック: XAでのアプリケーションの開発
8.1.1 サポートされているリソース・マネージャ
トランザクション参加側サービスは、リソース・マネージャを使用してアプリケーション・データを格納できます。
XAトランザクションでは、MicroTxライブラリがリソース・マネージャのクライアント・ライブラリにアクセスする必要があります。
Java XAトランザクション参加側アプリケーションの場合、MicroTxライブラリは次のリソース・マネージャでテストされます:
- Oracle Database 19c
- PostgreSQL 14.2
- MySQLおよびMicrosoft SQL Server
Node.js XAトランザクション参加側アプリケーションの場合、マイクロサービス対応トランザクション・マネージャ・ライブラリはOracle Database v19.xに対してテストされています。
XAトランザクション参加側アプリケーションは、XA非準拠リソース・マネージャ(MongoDB 4.1以降など)を使用できます。詳細は、「非XAリソースの最適化」を参照してください。
親トピック: リソース・マネージャの計画
8.1.2 リソース・マネージャのサポートされているドライバ
使用するリソース・マネージャで機能する、正しいJDBCドライバとUCPバージョンを必要に応じて選択するのはアプリケーション開発者の責任です。
リソース・マネージャとしてのOracle Databaseの使用
Oracle Databaseで動作するJDBCドライバおよびUCPバージョンを使用する必要があります。MicroTxライブラリは、XAResource
オブジェクトにアクセスして、リソース・マネージャに対して様々なXA操作を実行します。XAResource
オブジェクトはJDBCドライバによって提供されます。
MicroTx Javaライブラリでは、パフォーマンスを向上させるために、ユニバーサル接続プール(UCP)がOracle JDBCドライバとともに使用されます。
Java用のMicroTxライブラリは、Oracle Databaseドライバのバージョン21.3.0.0でテストされています。
Oracle Databaseをリソース・マネージャおよびMicroTx Node.jsライブラリとして使用する場合は、参加側アプリケーションでnode-oracledb
5.3.0以上を使用する必要があります。
ロギング・ラスト・リソース(LLR)トランザクションを使用する場合、データベース・ドライバの追加要件はありません。
リソース・マネージャとしてのOracle Database以外の使用
XADataSource
およびXAResource
インタフェースを実装する、サポートされているJDBCドライバを使用する必要があります。MicroTxライブラリは、XAResource
オブジェクトにアクセスして、リソース・マネージャに対して様々なXA操作を実行します。
親トピック: リソース・マネージャの計画
8.1.3 非XAリソースの最適化
ロギング・ラスト・リソース(LLR)またはラスト・リソース・コミット(LRC)の最適化を使用すると、1つの非XAリソースがグローバル・トランザクションに参加できるようになります。
マイクロサービスには、いくつかの参加側アプリケーションが含まれることがあり、各アプリケーションが異なるリソース・マネージャに接続されている場合があります。たとえば、1つのマイクロサービスに、リソース・マネージャとしてOracle Databaseを使用するトランザクション・イニシエータ・アプリケーションと、リソース・マネージャとしてMongoDBを使用するトランザクション参加側アプリケーションが含まれるとします。MongoDBではXAプロトコルはサポートされません。しかしながら、MongoDBとOracle Databaseのどちらもグローバル・トランザクションに参加する必要があります。MicroTxでは、LLRまたはLRCの最適化を有効にすると、そのようなマイクロサービスに対してXAトランザクションプロトコルを使用できます。
ロギング・ラスト・リソース(LLR)の最適化について
LLRの最適化を使用すると、1つの非XAリソースがXAと同じACID保証を使用してグローバル・トランザクションに参加できるようになります。
XAリソースは、トランザクション・コーディネータによって送信されるXAリクエスト(準備、コミット、ロールバックなど)を処理できます。非ネイティブまたは非XAリソースは、このようなリクエストを処理できません。LLRおよびLRCの最適化によって、1つの非XAリソースがXAトランザクションに参加できるようになります。トランザクション・コーディネータは、トランザクションの他のすべてのブランチを準備してから、LLRまたはLRCブランチに対するローカル・トランザクション・コミットの実行を試みます。他のすべてのブランチが問題なく準備されていると仮定すると、ローカル・コミットの結果によってトランザクションの結果が決まります。ローカル・コミットが正常に行われると、トランザクションが正常にコミットされます。それ以外の場合はトランザクションがロールバックされます。
ローカル・コミットを実行する前に、トランザクション・コーディネータはLLRブランチにコミット・レコードを作成します。エラーが発生した場合、トランザクション・コーディネータは、LLRブランチでxa_recover
をコールしてトランザクションのリストをリカバリしようとします。LLRブランチがローカル・トランザクションを正常にコミットした場合、commitRecord
によって、準備が完了した参加側のリストが返されます。LLRブランチがローカル・トランザクションのコミットに失敗した場合、recover()
メソッドによって、参加側が記録されていないことを示す情報が返されます。
LLRブランチが、トランザクション・コーディネータのコミット・レコードも含むローカル・トランザクションのコミットに成功した場合、recover()
によってコミット・レコードが返されます。
ラスト・リソース・コミット(LRC)の最適化について
MicroTxリリース22.3.2以降では、LRCの最適化を使用すると、1つの非XAリソースがXAと同じACID保証を使用せずにグローバル・トランザクションに参加できるようになります。
LRCでは、トランザクションのフローのシーケンスはLLRとほぼ同じです。イニシエータがトランザクション・コーディネータに対してcommitをコールすると、トランザクション・コーディネータはすべてのXAブランチを準備してから、LRCブランチでcommit()
をコールします。唯一の違いは、エラーの場合に、commit()
メソッドがNULL
をLRCのcommitRecord
の値として返すため、トランザクション詳細をリカバリできないことです。LLRでは、commit()
メソッドによって、準備が完了した参加側のリストがレスポンスで返されます。LRCでcommit()
がコールされると、ローカル・トランザクションがコミットされ、結果がトランザクション・コーディネータに返されます。ただし、準備が完了した参加側に関する情報は格納されていません。
トランザクション・ログの詳細情報が格納されないため、LRCの最適化は、サポートされているすべてのリソース・マネージャと連携します。ただし、ローカル・コミットが正常に完了したかどうかをトランザクション・コーディネータが確認する方法がないため、ヒューリスティックな結果になる可能性が高くなります。また、LRCではrecover()
メソッドを使用できないため、エラーの場合にトランザクションをリカバリできません。
LLRまたはLRCの選択
エラーの場合に詳細をリカバリできるため、非XAリソースについてLLRの最適化を使用することを強くお薦めします。LRCの最適化を使用するのは、非XAリソースがcommitRecord
の詳細すなわちトランザクション・ログの詳細を格納できない場合のみにしてください。
制限事項
- MicroTxでは、LLRまたはLRCの最適化を使用すると、1つの非XAリソースを含む1つの参加側アプリケーションのみが、XAトランザクションに参加できます。マイクロサービスに複数の非XAリソースがある場合、MicroTxはこのマイクロサービスのXAトランザクション・プロトコルをサポートしません。たとえば、複数のLLR参加側またはLRC参加側を使用しようとすると、エラー・メッセージ
Only one LLR or LRC participant is allowed to enlist
が表示されます。
イニシエータ・アプリケーションがそのトランザクションを起動した後で参加する場合は、そのイニシエータ・アプリケーションでLLRまたはLRCリソースを使用できます。
親トピック: リソース・マネージャの計画
8.1.4 複数のアプリケーションの共通リソース・マネージャ
MicroTxリリース22.3.1から、複数のトランザクション参加側サービスが単一のリソース・マネージャを使用し、トランザクションを最適化できます。
複数の参加側サービスに共通リソース・マネージャを使用する場合は、ORACLE_TMM_XA_RMID
環境変数の値を指定してトランザクションを最適化できます。リソース・マネージャを共有するすべての参加側サービスに対して1つのブランチのみが作成されるため、トランザクションは最適化されます。
部門A、部門Bおよび部門Cは、リソース・マネージャを共有するが、異なるORACLE_TMM_XA_RMID
値を持つ3つの参加側サービスであるとします。MicroTxは、部門ごとに新しいブランチを作成します。MicroTxで、トランザクションを追跡するためのブランチが合計3つ作成されます。
トランザクションを最適化するには、部門A、部門Bおよび部門CサービスのORACLE_TMM_XA_RMID
環境変数に、ORCL1などの一意の値を指定します。
ORACLE_TMM_XA_RMID
環境変数に値を指定すると、MicroTxは単一のリソース・マネージャを使用するすべてのサービスに対して単一のブランチを作成します。複数のブランチが作成されないため、トランザクションが最適化されます。このシナリオでは、MicroTxはトランザクションを最適化し、共通のリソース・マネージャと複数の参加側が関与するトランザクションを追跡する単一のブランチを作成します。この変数に値を指定しない場合、MicroTxはトランザクションを最適化せず、参加側サービスごとに1つずつ3つのブランチを作成します。
制限事項
- 複数の参加側サービスで共有できるのは、XA準拠のリソース・マネージャのみです。非XAリソースを複数の参加側サービスと共有することはできません。
- トランザクションに参加するイニシエータ・アプリケーションを含め、すべてのトランザクション参加側サービスに共通リソース・マネージャを使用できます。トランザクションを開始するがトランザクションに参加しないトランザクション・イニシエータ・サービスは、リソース・マネージャを必要としません。
- リソース・マネージャごとに一意のRMIDを使用する必要があります。異なるリソース・マネージャに同じRMIDを使用すると、トランザクションは失敗します。
親トピック: リソース・マネージャの計画
8.1.5 1つのアプリケーションでの複数のリソース・マネージャの構成
MicroTxリリース22.3.2以降では、1つの参加側サービスに対して複数のリソース・マネージャを使用できます。ビジネス・ロジックに基づいて、1つの参加側サービスは、複数のXA準拠リソース・マネージャに接続できます。ただし、1つのトランザクションで非XAリソースは1つしかサポートされません。
ノート:
この機能は、Javaアプリケーション用のMicroTxクライアント・ライブラリのみで提供されています。JPAまたはHibernateアプリケーションでは、XA準拠のリソース・マネージャのみがサポートされます。親トピック: リソース・マネージャの計画
8.1.6 XAトランザクションの動的リカバリについて
MicroTxリリース22.3.1から、トランザクション・コーディネータ・サーバーは、障害後にサーバーが再起動したときに進行中のトランザクションを再開します。
トランザクション・コーディネータが再起動するたびに、トランザクション・ストアで使用可能なデータに基づいて、すべてのプロトコル(XA、LRAおよびTCC)のトランザクションがリカバリされます。「トランザクション・リカバリについて」を参照してください。
また、XAトランザクション・プロトコルの場合、トランザクション・コーディネータは、コミットされていないトランザクションを動的にリカバリします。トランザクション・コーディネータは、コーディネータが失敗したときに進行中のトランザクションをチェックし、コミットまたはロールバック・コマンドを発行してトランザクションを完了します。トランザクションが見つからないか、すでに完了している場合、コーディネータはリソース・マネージャからトランザクション・レコードを削除します。
動的リカバリは、指定したリソース・マネージャID (RMID)に基づいて実行されます。各リソース・マネージャに指定するRMIDが一意であることを確認します。
トランザクション・コーディネータは、RMIDに基づいてリソース・マネージャごとに1回、動的リカバリを実行します。トランザクション・コーディネータ・インスタンスを再起動すると、リカバリ済情報は失われませんが、リカバリ済RMIDリストのマッピングは失われます。動的リカバリ中、RMIDごとにxa_recover
が1回コールされます。リソース・マネージャに関するリカバリ済情報はメモリーに保持されます。参加側が登録するたびに、トランザクション・コーディネータはRMIDを、メモリーに保持されているリカバリ済リソース・マネージャ・マッピングと照合します。これにより、リカバリ済リストにRMIDが存在しない場合にのみ、xa_recover
がコールされます。リカバリ済リストにRMIDが存在する場合、xa_recover
はコールされません。リソース・マネージャ・マッピングはメモリーに保持されるため、トランザクション・コーディネータが再起動すると、リカバリ済RMIDリストのリストが失われます。このようなシナリオでは、一意のRMIDが登録されるたびにリカバリが再度コールされます。
MicroTxがトランザクション・データを格納するようetcdまたはOracle Databaseを設定した場合は、コーディネータの再起動後、進行中のトランザクションに関する情報とトランザクションの詳細を取得できます。ただし、個別のトランザクション・ストアを設定しておらず、内部メモリーを使用してトランザクション詳細を格納している場合は、コーディネータがクラッシュまたは再起動すると、格納されているすべての情報が失われます。XAは動的リカバリをサポートしているため、内部メモリーを使用している場合、動的にリカバリされるすべての(xa_recover
)XAトランザクションはロールバックされ、その後にxa_forget
が続きます。
親トピック: リソース・マネージャの計画
8.2 リソース・マネージャとしてのPostgreSQLの構成
PostgreSQLをXAトランザクションのリソース・マネージャとして使用するには、準備完了状態のトランザクションおよびセッション・アフィニティを有効にする必要があります。
max_prepared_transactions
の値は0
に設定され、準備完了状態のトランザクションは無効になります。PostgreSQLで準備完了状態のトランザクションを有効にしないと、XAトランザクションを開始したときに次のエラー・メッセージが表示されます。Exception: org.postgresql.util.PSQLException: ERROR: prepared transactions are disabled
親トピック: XAでのアプリケーションの開発
8.3 トランザクション・タイムアウトの設定
XA参加側サービスから送信されたリクエストがアクティブである期間を指定します。トランザクションのコミットまたはロールバックが指定した期間内に行われないと、トランザクションはロールバックされます。
参加側サービスから送信されるリクエストのトランザクション・タイムアウトを設定するには:
ORACLE_TMM_TRANSACTION_TIMEOUT
の値はtxMaxTimeout
の値をオーバーライドできますが、txMaxTimeout
の値を超えることはできません。たとえば、txMaxTimeout
の値が70000で、ORACLE_TMM_TRANSACTION_TIMEOUT
の値が80000の場合、最長タイムアウトは70000ミリ秒に設定されます。txMaxTimeout
の値が90000で、ORACLE_TMM_TRANSACTION_TIMEOUT
の値が80000の場合、最長タイムアウトは80000ミリ秒に設定されます。
親トピック: XAでのアプリケーションの開発
8.4 XAトランザクション通知の受信の登録
MicroTxリリース22.3.2以降では、トランザクション・イニシエータ・サービスおよび参加側サービスを登録して、通知を受信できます。MicroTxは、イベントの発生時(準備フェーズの前およびMicroTxがトランザクションを正常にコミットまたはロールバックしたとき)に、登録したサービスについて通知します。
MicroTxコーディネータが、登録したサービスについて通知します。イベントの発生時にビジネス・ロジックに基づいてサービスが追加のタスクを実行するようにする場合には、サービスの登録をお薦めします。登録するリソースごとに、コールバック・リソースを作成し、2つのメソッドを宣言する必要があります(MicroTxが、イベント発生時に通知を送信するためにこれらをコールします)。
ノート:
この機能は、Javaサービスでのみ使用可能です。親トピック: XAでのアプリケーションの開発
8.5 ライブラリ・プロパティの構成
すべての参加側アプリケーションとイニシエータ・アプリケーションについてMicroTxライブラリ・プロパティの構成情報を指定します。
tmm.properties
ファイルを開き、次のパラメータの値を入力してMicroTxライブラリを構成します。-
oracle.tmm.TcsUrl
: MicroTxアプリケーションにアクセスするためのURLを入力します。「MicroTxへのアクセス」を参照してください。この値はトランザクション・イニシエータ・アプリケーションの場合に入力する必要があります。トランザクション参加側アプリケーションの場合、この値を指定する必要はありません。 -
oracle.tmm.TcsConnPoolSize
: MicroTxライブラリへの接続数をMicroTxに入力します。デフォルト(最小)の接続数は10です。最大値は20です。この値は、サービスが実行する問合せ数に応じて変更できます。この値はイニシエータ・アプリケーションと参加側アプリケーションの両方に指定します。 -
oracle.tmm.CallbackUrl
: 参加側サービスのURLを入力します。MicroTxは、指定されたURLを使用して参加側サービスに接続します。この値を次の形式で指定します。https://externalHostnameOfApp:externalPortOfApp/
説明externalHostnameOfApp
: イニシエータ・サービスまたは参加側サービスの外部ホスト名。たとえば、bookTicket-app
です。externalPortOfApp
: 参加側サービスにリモートでアクセスできるポート番号。たとえば、8081
です。
-
oracle.tmm.TransactionTimeout
: トランザクションをアクティブにしておく最長期間(ミリ秒)を指定します。トランザクションのコミットまたはロールバックが指定した期間内に行われないと、トランザクションはロールバックされます。デフォルト(最小)値は60000です。この値はイニシエータ・アプリケーションと参加側アプリケーションの両方に指定します。 -
oracle.tmm.PropagateTraceHeaders
: トランザクションを全面的にトレースする場合は、これをtrue
に設定します。これにより、すべての受信リクエストおよび送信リクエストのトレース・ヘッダーが伝播されます。Helidonベースのマイクロサービスの場合、Helidonフレームワークがデフォルトでトレース・ヘッダーを伝播するため、トレース・ヘッダーを2回伝播しないように、このプロパティをfalse
に設定します。このプロパティをtrueに設定できるのは、Helidon構成でトレース・ヘッダーの伝播が無効になっているときに、MicroTxを使用して分散トレースを有効にする場合です。その他のマイクロサービスの場合は、このプロパティをtrue
に設定します。 oracle.tmm.xa.Rmid
: MicroTxリリース22.3.1以降では、XAトランザクションで使用するリソース・マネージャごとに一意の文字列値を指定する必要があります。この値は、データ・ストアのプロパティとは関係ありません。RMIDとして指定する一意の値は、MicroTxがリソース・マネージャを識別するために使用されます。複数の参加側が同じリソース・マネージャを使用する場合、リソース・マネージャを共有する参加側に対して同じリソース・マネージャIDを指定します。oracle.tmm.xa.XaSupport
: XA準拠リソースを使用する場合は、これをtrue
に設定します。これをfalse
に設定するのは、非XAリソースを使用する単一のトランザクション参加側サービスに対してのみです。デフォルト値はtrue
です。oracle.tmm.xa.XaSupport
がtrue
に設定されると、oracle.tmm.xa.LLRSupport
およびoracle.tmm.xa.LRCSupport
に設定された値は無視されます。oracle.tmm.xa.LLRSupport
: ロギング・ラスト・リソース(LLR)の最適化を有効にするには、これをtrue
に設定します。この値は、非XAリソースをリソース・マネージャとして使用するトランザクション参加側サービスについてのみ設定します。デフォルト値はfalse
です。oracle.tmm.xa.LLRSupport
がtrue
に設定されると、oracle.tmm.xa.LRCSupport
に設定された値は無視されます。oracle.tmm.xa.LRCSupport
: ラスト・リソース・コミット(LRC)の最適化を有効にするには、これをtrue
に設定します。この値は、非XAリソースをリソース・マネージャとして使用するトランザクション参加側サービスについてのみ設定します。デフォルト値はfalse
です。
oracle.tmm.TcsUrl = http://tmm-app:9000/api/v1
oracle.tmm.TcsConnPoolSize = 15
oracle.tmm.CallbackUrl = https://bookTicket-app:8081
oracle.tmm.PropagateTraceHeaders = true
oracle.tmm.TransactionTimeout = 60000
oracle.tmm.xa.XaSupport = true
oracle.tmm.xa.LLRSupport = false
oracle.tmm.xa.LRCSupport = false
oracle.tmm.xa.Rmid = ORCL1
アプリケーションとMicroTxが同じKubernetesクラスタ内にある場合はHTTPプロトコルを使用し、それ以外の場合はHTTPSプロトコルを使用します。
これらの構成値を環境変数として指定することもできます。application.properties
ファイルと環境変数の両方に値を指定した場合、環境変数に設定されている値がプロパティ・ファイルの値をオーバーライドすることに注意してください。
次の例は、環境変数を構成するためのサンプル値を示しています。
export ORACLE_TMM_TCS_URL= http://tmm-app:9000/api/v1
export ORACLE_TMM_CALLBACK_URL = http://bookTicket-app:8081
export ORACLE_TMM_PROPAGATE_TRACE_HEADERS = true
export ORACLE_TMM_TCS_CONN_POOL_SIZE = 15
export ORACLE_TMM_TRANSACTION_TIMEOUT = 60000
export ORACLE_TMM_XA_XASUPPORT = true
export ORACLE_TMM_XA_LLRSUPPORT = false
export ORACLE_TMM_XA_LRC_SUPPORT = false
export ORACLE_TMM_XA_RMID = ORCL1
環境変数名では大/小文字が区別されることに注意してください。
親トピック: XAでのアプリケーションの開発
8.6 XAでのJavaアプリケーションの開発
JavaアプリケーションでMicroTxライブラリを使用します。
Java用のMicroTxライブラリは次の機能を実行します:
- 参加側サービスをトランザクション内でトランザクション・コーディネータに登録します。
- 使用する参加側アプリケーション・コードのために依存関係インジェクションを介して
XADataSource
オブジェクトを注入し、関連付けられたXAResource
に対してstart()
をコールします。参加側マイクロサービス(XAトランザクションのコンテキストでコールされるマイクロサービス)は、XA準拠のデータ・ソースを使用する必要があります。Javaでは、これはXADataSource
オブジェクトの使用を意味します。MicroTxライブラリは、構成済のデータ・ソースを参加側サービスに自動的に注入するため、アプリケーション開発者は
@Inject
または@Context
注釈をアプリケーション・コードに追加する必要があります。アプリケーション・コードは、この関連付けを使用してDMLを実行します。 - リソース・マネージャをコールして操作を実行します。
- トランザクション・イニシエータとしてのJavaアプリケーションの構成
トランザクション・イニシエータ・サービスは、トランザクションを開始します。トランザクション・イニシエータ・サービスは、アプリケーションのビジネス・ロジックに基づいて、トランザクションの開始のみ、またはトランザクションの開始とトランザクションへの参加を行うことができます。 - トランザクション参加側としてのJavaアプリケーションの構成
リソース・マネージャがXAに準拠しているかどうかに基づいて、環境変数を設定し、MicroTxライブラリの様々なクラスを実装して参加側アプリケーションを構成します。 - トランザクション参加側としてのJPAベースのJavaアプリケーションの構成
この項に記載されている情報を使用して、HibernateまたはEclipseLinkを、HelidonまたはSpring BootアプリケーションのJPAプロバイダとして構成します。
親トピック: XAでのアプリケーションの開発
8.6.1 トランザクション・イニシエータとしてのJavaアプリケーションの構成
トランザクション・イニシエータ・サービスは、トランザクションを開始します。トランザクション・イニシエータ・サービスは、アプリケーションのビジネス・ロジックに基づいて、トランザクションの開始のみ、またはトランザクションの開始とトランザクションへの参加を行うことができます。
開始する前に、アプリケーションがトランザクションを開始するだけか、トランザクションを開始して参加するのかを確認します。2つのシナリオでは要件が若干異なるため、それに応じてアプリケーションを構成します。
- シナリオ1: 銀行振込アプリケーションによって、ある部門から別の部門に送金します。この場合、振込アプリケーションはトランザクションを開始するだけで、トランザクションには参加しません。振込アプリケーションは、トランザクションを完了するためにビジネス・ロジックに基づいて様々なサービスをコールします。データベース・インスタンスは、振込アプリケーションにアタッチされる場合とアタッチされない場合があります。
- シナリオ2: 銀行振込アプリケーションによって、ある部門から別の部門に送金します。振込アプリケーションは、トランザクションごとに手数料として1%を請求します。この場合、振込アプリケーションはトランザクションを開始して参加します。データベース・インスタンスは、トランザクション情報を保存するために振込アプリケーションにアタッチされる必要があります。
installation_directory\otmm-RELEASE\samples\xa\java\accounts
にあります。これは、MicroTx JavaライブラリをJavaイニシエータ・アプリケーションのビジネス・ロジックとともに使用する方法の例です。このサンプル・アプリケーションは振込(Teller)という名前です。これは2つの部門間のトランザクションを開始します。部門Aをコールして一定金額を引き出し、部門Bをコールして預け入れます。
親トピック: XAでのJavaアプリケーションの開発
8.6.2 トランザクション参加側としてのJavaアプリケーションの構成
リソース・マネージャがXAに準拠しているかどうかに基づいて、環境変数を設定し、MicroTxライブラリの様々なクラスを実装して参加側アプリケーションを構成します。
- XA準拠リソース・マネージャを使用するJDBCベースのJavaアプリケーションの構成
XA準拠のリソース・マネージャを使用する場合は、この項に記載されている情報を使用してJDBCベースのJava参加側アプリケーションを構成します。 - 複数のXA準拠リソース・マネージャを使用するJDBCベースのJavaアプリケーションの構成
複数のXA準拠のリソース・マネージャを使用する場合は、この項に記載されている情報を使用してJDBCベースのJava参加側アプリケーションを構成します。 - 非XA JDBCリソースを使用するJavaアプリケーションの構成
XAをサポートしないJDBCリソースを使用する場合は、この項に記載されている情報を使用してJava参加側アプリケーションを構成します。 - 非XAかつ非JDBCのリソースを使用するJavaアプリケーションの構成
XAもJDBCもサポートしないリソースを使用する場合は、この項に記載されている情報を使用してJava参加側アプリケーションを構成します。
親トピック: XAでのJavaアプリケーションの開発
8.6.2.1 XA準拠リソース・マネージャを使用するJDBCベースのJavaアプリケーションの構成
XA準拠のリソース・マネージャを使用する場合は、この項に記載されている情報を使用してJDBCベースのJava参加側アプリケーションを構成します。
8.6.2.2 複数のXA準拠リソース・マネージャを使用するJDBCベースのJavaアプリケーションの構成
複数のXA準拠のリソース・マネージャを使用する場合は、この項に記載されている情報を使用してJDBCベースのJava参加側アプリケーションを構成します。
8.6.2.3 非XA JDBCリソースを使用するJavaアプリケーションの構成
XAをサポートしないJDBCリソースを使用する場合は、この項に記載されている情報を使用してJava参加側アプリケーションを構成します。
8.6.3 トランザクション参加側としてのJPAベースのJavaアプリケーションの構成
この項に記載されている情報を使用して、HibernateまたはEclipseLinkを、HelidonまたはSpring BootアプリケーションのJPAプロバイダとして構成します。
トランザクション参加側としてのJPAベースのアプリケーションの構成は、トランザクション参加側としてのJDBCベースのJavaアプリケーションの構成に似ています。
JDBCベースのJavaアプリケーションをトランザクション参加側として構成するには、カスタム・データ・ソース・オブジェクトを作成し、このオブジェクトをMicroTxライブラリに渡します。Javaアプリケーション・コードで、カスタム・データ・ソースの詳細をTrmSQLConnection
接続オブジェクトに注入してから、注入されたオブジェクトを使用するようにアプリケーション・コードを更新します。
JPAベースのJavaアプリケーションをトランザクション参加側として構成するには、カスタム・データ・ソース・オブジェクトを作成し、このオブジェクトをMicroTxライブラリに渡します。アプリケーション・コードで、カスタム・データ・ソースの詳細をTrmEntityManager
オブジェクトに注入してから、注入されたオブジェクトを使用するようにアプリケーション・コードを更新します。
- XA準拠リソース・マネージャを使用するJPAベースのJavaアプリケーションの構成
XA準拠のリソース・マネージャを使用する場合は、この項に記載されている情報を使用して、XAトランザクションに参加するHelidonまたはSpring BootアプリケーションのJPAプロバイダとしてHibernateまたはEclipseLinkを使用します。
親トピック: XAでのJavaアプリケーションの開発
8.6.3.1 XA準拠リソース・マネージャを使用するJPAベースのJavaアプリケーションの構成
XA準拠のリソース・マネージャを使用する場合は、この項に記載されている情報を使用して、XAトランザクションに参加するHelidonまたはSpring BootアプリケーションのJPAプロバイダとしてHibernateまたはEclipseLinkを使用します。
8.7 XAでのNode.jsアプリケーションの開発
- トランザクション・イニシエータとしてのNode.jsアプリケーションの構成
トランザクション・イニシエータ・サービスは、トランザクションを開始します。トランザクション・イニシエータ・サービスは、アプリケーションのビジネス・ロジックに基づいて、トランザクションの開始のみ、またはトランザクションの開始とトランザクションへの参加を行うことができます。 - トランザクション参加側としてのNode.jsアプリケーションの構成
リソース・マネージャがXAに準拠しているかどうかに応じて、環境変数を設定し、ライブラリから異なるクラスを実装します。
親トピック: XAでのアプリケーションの開発
8.7.1 トランザクション・イニシエータとしてのNode.jsアプリケーションの構成
トランザクション・イニシエータ・サービスは、トランザクションを開始します。トランザクション・イニシエータ・サービスは、アプリケーションのビジネス・ロジックに基づいて、トランザクションの開始のみ、またはトランザクションの開始とトランザクションへの参加を行うことができます。
開始する前に、アプリケーションがトランザクションを開始するだけか、トランザクションを開始して参加するのかを確認します。2つのシナリオでは要件が若干異なるため、それに応じてアプリケーションを構成します。
- シナリオ1: 銀行振込アプリケーションによって、ある部門から別の部門に送金します。この場合、振込アプリケーションはトランザクションを開始するだけで、トランザクションには参加しません。振込アプリケーションは、トランザクションを完了するためにビジネス・ロジックに基づいて様々なサービスをコールします。データベース・インスタンスは、振込アプリケーションにアタッチされる場合とアタッチされない場合があります。
- シナリオ2: 銀行振込アプリケーションによって、ある部門から別の部門に送金します。振込アプリケーションは、トランザクションごとに手数料として1%を請求します。この場合、振込アプリケーションはトランザクションを開始して参加します。データベース・インスタンスは、トランザクション情報を保存するために振込アプリケーションにアタッチされる必要があります。
親トピック: XAでのNode.jsアプリケーションの開発
8.7.2 トランザクション参加側としてのNode.jsアプリケーションの構成
リソース・マネージャがXAに準拠しているかどうかに応じて、環境変数を設定し、ライブラリから異なるクラスを実装します。
- XA準拠リソース・マネージャを使用するNode.jsアプリケーションの構成
XA準拠のリソース・マネージャを使用する場合は、この項に記載されている情報を使用してNode.jsトランザクション参加側アプリケーションを構成します。 - 非XAリソースを使用するNode.jsアプリケーションの構成
非XAリソース(MongoDBなど)を使用する場合は、この項に記載されている情報を使用してNode.jsトランザクション参加側アプリケーションを構成します。
親トピック: XAでのNode.jsアプリケーションの開発
8.7.2.1 XA準拠リソース・マネージャを使用するNode.jsアプリケーションの構成
XA準拠のリソース・マネージャを使用する場合は、この項に記載されている情報を使用してNode.jsトランザクション参加側アプリケーションを構成します。
8.8 トランザクション参加側としてのORDSアプリケーションの開発
この項では、Oracle Databaseサンプル・アプリケーションをデプロイして実行するというコンテキストで、データベース・アプリケーションをXA参加側として構成する詳しいステップを説明します。
MicroTxを使用したトランザクションにおいて、Oracle Databaseアプリケーションをトランザクション参加側として構成できます。Oracle ApexおよびOracle REST Data Services (ORDS)を使用して構築したOracle Databaseアプリケーションは、XAトランザクション参加側としてのみサポートされます。
データベース・アプリケーションは、Oracle Databaseを使用するOracle APEXおよびORDSのアプリケーションです。データベース・アプリケーションを実行できるのは、Oracle Cloud Infrastructureの管理対象APEXサービス、KubernetesクラスタにデプロイされたOracle RADスタック、あるいはVMまたは物理ホスト内にデプロイされたOracle RADスタックです。Oracle RADスタックは、Oracle REST Data Services (ORDS)、Oracle APEXおよびOracle Databaseの3つのコア・コンポーネントに基づいた包括的テクノロジ・スタックです。
- 前提条件
- SQL用のMicroTxライブラリの実行
XA向けMicroTxライブラリ(PL/SQL)には、MicroTxによって調整されるXAトランザクションにOracle Databaseアプリケーションが参加するための一連の関数およびストアド・プロシージャが用意されています。 - ORDSアプリケーションの構築
- XAトランザクションの実行
XAサンプル・アプリケーションを例として使用して、XAトランザクションを実行する方法を説明します。
親トピック: XAでのアプリケーションの開発
8.8.1 前提条件
開始する前に、次のタスクを完了してください。
- Oracle REST Data Services (ORDS)、Oracle APEXおよびOracle Databaseで構成される作業スタックを作成するか指定します。このスタックは、MicroTxが実行されるのと同じKubernetesクラスタで実行することも、他の環境で実行することもできます。
- 同じKubernetesクラスタにデプロイしない場合は、MicroTxとデータベース・アプリケーションの間にネットワーク・アクセスまたは接続があることを確認します。
- Oracle Databaseで既存のスキーマを使用するか、新しいスキーマを作成します。スキーマをORDSに登録していることを確認します。https://docs.oracle.com/en/database/oracle/application-express/21.1/aeutl/accessing-RESTful-services.htmlを参照してください。
- ORDSサービスが登録したスキーマで使用できることを確認します。たとえば、
http://localhost:50080/ords
です。スキーマのユーザー資格証明を使用してAPEXワークスペースにログインします。 -
アクセス制御リスト(ACL)を作成して権限を追加します(デフォルトではアウトバウンドRESTコールが許可されない場合)。
MicroTxライブラリは、参加側サービスをXAトランザクションに登録するためのMicroTxトランザクション・コーディネータへのアウトバウンドRESTコールを行います。
必要なACLを作成し、データベースに追加します。ACLを追加するには、
sysdba
権限が必要です。次に、ACLの例を示します。必要なACLの追加の詳細は、APEXのドキュメントを参照してください。/ BEGIN DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE( host => '#TMM_HOST_NAME', lower_port => null, upper_port => null, ace => xs$ace_type(privilege_list => xs$name_list('connect', 'resolve', 'http'), principal_name => '#PRINCIPAL_NAME', principal_type => xs_acl.ptype_db)); END; /
ここでは、次の値を、環境に固有の値に置き換える必要があります。
#TMM_HOST_NAME
: ホスト名またはMicroTxの外部IPアドレスを入力します。#PRINCIPAL_NAME
APEXのプリンシパル・ユーザーの名前を入力します。
8.8.2 SQL用のMicroTxライブラリの実行
XA向けMicroTxライブラリ(PL/SQL)には、MicroTxによって調整されるXAトランザクションにOracle Databaseアプリケーションが参加するための一連の関数およびストアド・プロシージャが用意されています。
8.8.3 ORDSアプリケーションの構築
TmmStart
関数を使用すると、XAトランザクションをMicroTxで調整できます。MicroTxに対してRESTコールを行い、XAトランザクションに参加側を登録し、コールバックREST APIを登録します。
TmmStart
関数からオブジェクトが返され、属性proceed
が提供されます。これは、TmmStart
関数が正常に実行されたかどうか、トランザクションを先に進められるかどうかを示します。
Proceedの値 | 意味 |
---|---|
0 | XAトランザクション内でTmmStart 関数がコールされましたが、XAの初期化は成功しませんでした。つまり、アプリケーション・コードでXAトランザクションを進めることはできません。
|
1 | XAトランザクション内でTmmStart 関数がコールされ、XAの初期化が成功しました。つまり、アプリケーション・コードでXAトランザクションを進める必要があります。
|
2 | MicroTx XAトランザクションがなく、ローカル・トランザクション内で関数が実行されています。つまり、アプリケーション・コードを通常どおりに進めます。 |
ビジネス・ロジックの実行が完了したら、TmmEnd
関数をコールします。