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段階コミットのコミットまたはロールバック要求を送信しなくなります。