XAプロトコルは、1991年にX/Open社によって公開された標準プロトコルです。XAはeXtended Architectureの略であり、このプロトコルは異種システム間でグローバルトランザクションの原子性を保証する方法を解決することを目的としています。
分散トランザクション処理モデル
分散トランザクション処理(Distributed Transaction Processing、DTP)モデルは、標準化された分散トランザクション処理のアーキテクチャおよびインターフェースを定義しています。アプリケーションプログラム(Application Program、AP)は、複数のリソースマネージャー(Resource Manager、RM)が提供するリソースにアクセスできます。各リソースマネージャーは独立しており、必ずしも同種である必要はありません。グローバルトランザクションの原子性はトランザクションマネージャーが担当し、各モジュール間の相互作用は以下の図のとおりです。

図に示すように、分散トランザクション処理モデルでは、OceanBaseデータベースシステムがリソースマネージャーとして機能し、一部のデータリソースを管理します。トランザクションマネージャーとの相互作用のために、OceanBaseデータベースは標準のXAプロトコルインターフェースを提供しています。これらのインターフェースを実装するために、OceanBaseデータベース内部には、各XAプロトコルインターフェースの外部意味の標準性を保証するサブプログラムが備え付けられています。トランザクションマネージャーはインターフェースを呼び出してOceanBaseデータベース内部のサブプログラムをトリガーし、サブプログラムの処理完了後に結果をトランザクションマネージャーに返します。トランザクションマネージャーは返された結果に基づいて次の処理を行います。
基本概念
分散トランザクション処理モデルをさらに理解する前に、以下の基本概念を理解しておく必要があります:
アプリケーションプログラム(application program、AP)
アプリケーションプログラムはグローバルトランザクションの境界を定義し、グローバルトランザクションを構成する関連するデータアクセス操作を指定します。
リソースマネージャー(resource manager、RM)
リソースマネージャーは、共有可能で復元可能なデータリソースを管理します。例えば、従来のリレーショナルデータベース管理システムなどが該当します。障害が発生した場合、リソースマネージャーはデータリソースを一貫性のある状態に復元できます。OceanBaseデータベースシステムはリソースマネージャーとして機能できます。
トランザクションブランチ(branch)
通常、グローバルトランザクションは複数のリソースマネージャー上のデータにアクセスします。そのグローバルトランザクションが特定のリソースマネージャー上での実行は、そのグローバルトランザクションの一つのブランチ(branch)と見なすことができます。
トランザクションマネージャー(transaction manager、TM)
トランザクションマネージャーは、トランザクションの境界を指定するためのインターフェースを提供し、グローバルトランザクションのコミットとリカバリを担当します。グローバルトランザクションが複数のリソースマネージャーに関わる場合、そのグローバルトランザクションのコミットの原子性を保証するために、トランザクションマネージャーは2フェーズコミットプロトコルを採用します。
原子性の保証
グローバルトランザクションがコミット段階に入ると、トランザクションマネージャーはそのグローバルトランザクションの原子性を保証する必要があります。トランザクションマネージャーは2フェーズコミットプロトコルを採用しており、主なプロセスは以下のとおりです:
準備段階:トランザクションマネージャーは、当該グローバルトランザクションが関わるリソースマネージャーに準備要求を送信します。各リソースマネージャーは準備要求を受信すると、ローカルのXAトランザクションブランチの変更を永続化します。永続化に成功すると、成功メッセージをトランザクションマネージャーに返します。この段階で、OceanBaseデータベースシステムは対応するトランザクションブランチのRedoログを永続化します。
コミット/ロールバック段階:当該グローバルトランザクションが関わるすべてのリソースマネージャーから成功応答を受信した後、トランザクションマネージャーはこれらのリソースマネージャーにコミット要求を送信します。そうでない場合は、ロールバック要求を送信します。リソースマネージャーはコミットまたはロールバック要求を受信すると、対応するトランザクションブランチをコミットまたはロールバックします。この段階で、OceanBaseデータベースシステムは要求の種類に応じて、対応するトランザクションブランチのログを永続化します。具体的には、コミット要求の場合はコミットログを、ロールバック要求の場合はロールバックログを永続化します。永続化が終了すると、そのトランザクションブランチのリソースを解放します。
緊密結合モード
分散トランザクション処理モデルでは、複数のリソースマネージャーが基盤として同一のデータベースにアクセスする場合があります。そのため、グローバルトランザクションの複数のトランザクションブランチが同一のデータベースにアクセスすることがあります。このような場合、グローバルトランザクションを緊密結合モードに設定すると、同一のデータベースにアクセスする複数のトランザクションブランチがリソースを共有します。つまり、これらのブランチ間では互いの変更を認識し合えます。OceanBaseデータベースシステムでは、2つのブランチが緊密結合ブランチである場合、これら2つのブランチはロックリソースを共有します。具体的には、あるトランザクションブランチが特定のデータ項目にロックをかけた後、別のトランザクションブランチは自分もそのデータ項目にロックをかけているとみなすことができます。
最適化メカニズム
1段階コミット
あるグローバルトランザクションがアクセスするデータが単一のリソースマネージャ上のデータリソースのみに関わる場合、そのグローバルトランザクションは2段階コミットメカニズムを採用する必要はありません。具体的には、グローバルトランザクションがコミット段階に入った後、TM側がそのグローバルトランザクションが単一のリソースマネージャ上のデータのみにアクセスしていることを検出した場合、トランザクションマネージャは対応するリソースマネージャに1段階コミットリクエストを送信できます。そのリソースマネージャがOceanBaseデータベースシステムの場合、1段階コミットリクエストを受信すると、対応するトランザクションブランチを直接コミットできます。このリクエスト処理終了後、OceanBaseデータベースシステムはトランザクションが保持するリソースを解放できます。1段階コミットリクエストの応答を受信すると、トランザクションマネージャは結果を返却でき、リソースマネージャに追加のリクエストを送信する必要はありません。
読み取り専用トランザクションブランチ
あるグローバルトランザクションについて、それが関わる特定のリソースマネージャが読み取りサービスのみを提供している場合、そのグローバルトランザクションがコミット段階に入った後、そのリソースマネージャはそのグローバルトランザクションの永続化のためにいかなるデータ変更も行う必要はありません。OceanBaseデータベースシステムが特定のトランザクションブランチの準備リクエストを受信した後、そのトランザクションブランチがいかなるデータも変更していないことを検出した場合、特別な応答メッセージを返却し、その後そのトランザクションブランチが保持するリソースを解放できます。トランザクションマネージャがこの特別な応答を受信すると、そのトランザクションブランチが読み取り専用トランザクションブランチであることを知ることができ、今後そのリソースマネージャに対して2段階コミットのコミットまたはロールバックリクエストを送信することはありません。