2 フェーズ・コミット処理
分散トランザクション とは、 マルチプロセスで実行されるトランザクションのことで、通常、数台のマシンの上で 実行されます。各プロセスは、このトランザクションのために作業を 行います。このことを、図 1 に示します。図中の楕円の それぞれは、異なるマシンで実行されている作業を示しています。また、楕円と楕円の 間の矢印は、リモート・プロシージャー・コール (RPC) を示しています。

分散トランザクションは、ローカル・トランザクションと同様に、ACID 特性を維持する必要があります。 ただし、いかなるプロセスでも障害が発生する可能性があるため、分散トランザクションでこの特性を維持することは、 非常に複雑です。 どのプロセスで障害が発生しても、それぞれのプロセスは、トランザクションのためにすでに行った作業を元に戻す必要があります。
分散トランザクション処理システムは、以下の 2 つの方法を使用して、 分散トランザクションの ACID 特性を維持します。
- リカバリー可能プロセス。リカバリー可能プロセスは自己の アクションのログを取るので、障害が発生しても障害の発生する前の状態を リカバリーすることができます。
- コミット・プロトコル。コミット・プロトコルは、 マルチプロセスでのトランザクションのコミットまたは打ち切りの調整を可能に します。
リカバリー可能プロセスには、トランザクションの状態情報とデータに加える変更の説明 という、2 つのタイプの情報を保管することができます。これらの情報によって、 プロセスが 2 フェーズ・コミットに参加して独立性と耐久性を確保することが 可能になります。トランザクションの状態情報は、すべてのリカバリー可能プロセスに 保管されていなければなりません。しかし、データに加える変更の説明が保管されて いなければならないのは、アプリケーション・データを管理する プロセス (リソース・マネージャーなど) だけです。分散トランザクションに 参加するプロセスがすべてリカバリー可能である必要はありません。一般に、 クライアントは、リソース・マネージャーと直接対話することがないので、 リカバリー可能にはなっていません。
最も一般的なコミット・プロトコルは、2 フェーズ・コミット・プロトコル です。どのトランザクションでも、1 つのプロセスがコーディネーターの役割を 果たします。コーディネーター は、トランザクションに 参加する他のプロセスを監督し、一貫性のある結果が得られるようにします。 2 フェーズ・コミット・プロトコルは、以下の 2 つのフェーズを伴います。
- 準備フェーズ
- 準備フェーズ では、 コーディネーターはトランザクションに参加している各プロセスにメッセージを送ります。コーディネーターは、各プロセスに、 コミットの準備をするように要求します。 プロセスは、準備を行うと、 トランザクションをコミットできることを保証し、自己が行った作業の永続レコードを 作成します。コミットできることを保証したあとは、一方的に打ち切りを決定することは できません。プロセスの準備が不可能な場合 (すなわち、トランザクションのコミットが可能である ことを保証できない場合) は、打ち切らなければなりません。
- 解決フェーズ
- 解決フェーズ では、 コーディネーターは応答を記録します。 すべての参加プロセスでコミットの準備が できていれば、トランザクションはコミットされます。そうなっていない場合は、 トランザクションは打ち切られます。いずれの場合でも、コーディネーターは すべての参加プロセスに結果を通知します。コミットの場合は、参加プロセスはコミットを 行ったことを確認通知します。データに対してコミットされた変更は、永続します。 これにより、正常に終了したトランザクションは永続的な変更としてデータベースに 反映され、ハードウェアやソフトウェアのエラーの影響を受けずに保持されることに なります。