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段階コミットメカニズムを採用する必要はありません。具体的には、あるグローバルトランザクションがコミット段階に入った後、TM側がそのグローバルトランザクションが単一のリソースマネージャー上のデータのみにアクセスしていることを検出した場合、トランザクションマネージャーは対応するリソースマネージャーにファーストコミットリクエストを送信できます。このリソースマネージャーがOceanBaseデータベースシステムである場合、ファーストコミットリクエストを受信した後、直接対応するトランザクションブランチをコミットできます。このリクエスト処理が終了すると、OceanBaseデータベースシステムはトランザクションが保持するリソースを解放できます。ファーストコミットリクエストの応答を受信した後、トランザクションマネージャーは結果を返すことができ、リソースマネージャーに追加のリクエストを送信する必要はありません。
読み取り専用トランザクションブランチ
あるグローバルトランザクションについて、それが関与する特定のリソースマネージャーが読み取りサービスのみを提供している場合、そのグローバルトランザクションがコミット段階に入った後、そのリソースマネージャーはそのグローバルトランザクションの永続化のためにデータ変更を行う必要はありません。OceanBaseデータベースシステムが特定のトランザクションブランチの準備リクエストを受信した後、そのトランザクションブランチがデータを一切変更していないことを検出した場合、特別な応答メッセージを返してから、そのトランザクションブランチが保持するリソースを解放できます。トランザクションマネージャーがこの特別な応答を受信すると、そのトランザクションブランチが読み取り専用トランザクションブランチであることを知ることができ、今後はそのリソースマネージャーに対して2段階コミットのコミットまたはロールバックリクエストを送信することはありません。