7.3.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()
メソッドによって、参加側が記録されていないことを示す情報が返されます。
デフォルトでは、コミット・レコードは2時間後に削除されます。コミット・レコードが保持される期間を変更するには、oracle.tmm.LlrDeleteCommitRecordInterval
プロパティで期間を指定します。たとえば、600000ミリ秒または10分を指定すると、過去10分間に作成されたコミット・レコードのみが保持され、それ以前のレコードは削除されます。
LLRブランチが、トランザクション・コーディネータのコミット・レコードも含むローカル・トランザクションのコミットに成功した場合、recover()
によってコミット・レコードが返されます。
ラスト・リソース・コミット(LRC)の最適化について
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リソースを使用できます。
親トピック: リソース・マネージャの計画