17.6. 同期プロトコル

2 相コミットプロトコルに加えて、従来のトランザクション処理システムは追加のプロトコルを使用します。多くの場合、同期プロトコル と呼ばれます。もともとの ACID プロパティにより、持続性が重要なのは障害発生にも関わらず状態変更が利用できなければならない場合です。アプリケーションはデーターベースなど何らかの永続性ストアと連携します。ディスクアクセスはコンピュータのメインメモリにアクセスするよりはるかに遅いため、この連携は相当なオーバーヘッドを課す可能性があります。
ディスクアクセス時間の問題の解決策のひとつとして、メインメモリに状態をキャッシュし、トランザクションの期間にキャッシュのみで動作することです。残念ながら、この解決策にはトランザクションが終了する前に永続ストアに状態をフラッシュバックする方法が必要です。そうしなければ、ACID プロパティ全体を失うリスクを負うことになります。これは同期プロトコルが 同期パーティシパント と行うことです。
トランザクションがコミット寸前であることが同期に知らされます。この時点でキャッシュされた状態をトランザクションのコミット前に永続的な表現にフラッシュします。これはアプリケーションのパフォーマンスを向上するために使用されることがあります。次に、トランザクションが完了した時およびその完了状態が同期に知らされます。

手順17.1 同期により作成された「4 相プロトコル」

実質的に同期は 2 相コミットプロトコルを 4 相プロトコルに変えます。
  1. ステップ 1

    トランザクションが 2 相コミットを開始する前に、すべての登録された同期は通知されます。この時点で障害が発生すると、トランザクションはロールバックされます。
  2. ステップ 2 と 3

    次に、コーディネータは通常の 2 相コミットプロトコルを実行します。
  3. ステップ 4

    トランザクションが終了した時点で、すべての登録された同期は通知されます。ただし、この段階で発生する障害はすべて無視されるためこれは任意の呼び出しです。つまりトランザクションは終了し、影響が及ぶものは何もありません。
同期プロトコルには従来の 2 相コミットプロトコルと同じ障害要件はありません。例えば、同期パーティシパントには障害が発生した場合のリカバリ機能は必要ありません。その理由は、2 相コミットプロトコルの完了前のすべての障害によってトランザクションはロールバックされ、完了後の障害は同期パーティシパントが関与するデータには影響を及ぼさないためです。