2フェーズ・コミットのプロトコル

前述のとおり、分散トランザクションは2フェーズ・コミットのプロトコルに従います。TimesTen Scaleoutでは、次のように2フェーズ・コミットのプロトコルを実装します。

ノート:

このトピックを読む前に、「トランザクション・マネージャ」および「永続性の設定」で説明されている概念を理解しておいてください。

フェーズ0: トランザクション

  1. アプリケーションが、データベースへの接続を確立します。すべての接続は、データベースの特定の要素に関連付けられ、その接続から開始されるすべての分散トランザクションのトランザクション・マネージャとなります。

  2. アプリケーションが、1つ以上のSQL文を実行します。トランザクション・マネージャは、すべての参加者に文を送信して実行します。SQL文の実行で返された結果に基づいて、トランザクション・マネージャは参加者のステータスを識別して更新します。

  3. アプリケーションが、コミットを発行します。

フェーズ1: 準備フェーズ

  1. トランザクション・マネージャが、すべての参加者に準備メッセージを送信します。このメッセージには、トランザクション・マネージャおよびすべての参加者のIDが含まれています。

  2. 準備メッセージを受信した各参加者が、次のいずれかの操作を実行します。

    • 参加者が書込み参加者である場合は、情報を格納して、その後、トランザクションをコミットまたはロールバックするコミットの準備ログ・レコードを書き込みます。また、参加者は、読取り操作を防ぐために変更された行をロックします。

    • 参加者が読取り参加者である場合は、トランザクションを読取り専用として識別します。

  3. 参加者が、コミット決定の投票によって、トランザクション・マネージャに準備レスポンスを送信します。

    • 書込み参加者がコミットの準備ログ・レコードを書き込むことができた場合は、「Yes」のみを投票します。

      ノート:

      Durability1に設定されている場合、参加者は永続コミットの準備ログ・レコードを書き込みます。

    • 読取り参加者は、常に「Yes」を投票し、コミットの決定を待機しないでトランザクションをコミットします。この場合、コミット操作は、トランザクションに関連するすべてのロックおよび一時リソースの解放で構成されます。

フェーズ2: コミット・フェーズ

  1. トランザクション・マネージャは、トランザクションに参加するすべてのレプリカ・セット内の1つ以上の要素から準備レスポンスを受信すると、コミットの決定を含むコミットの準備ログ・レコードを書き込みます。トランザクション・マネージャでは、コミットの決定は表6-2に記載されたシナリオに基づきます。

    表6-2 コミットの決定のシナリオ

    シナリオ 決定

    すべての書込み参加者がその準備レスポンスで「Yes」投票を送信し、その中に各参加レプリカ・セットの1つ以上の要素があります。(失敗した参加者は、そのレプリカがレスポンスを送信するかぎり、障害が発生したとして識別されるとコミットの決定に影響を与えません。)

    コミット

    いずれかの書込み参加者が準備レスポンスで「No」投票を送信します。

    ロールバック

  2. トランザクション・マネージャが、すべての書込み参加者にコミットの決定とともにメッセージを送信します。

  3. トランザクション・マネージャを含むすべての書込み参加者が、コミットの決定に基づいてトランザクションをコミットまたはロールバックします。

図6-1は、TimesTen Scaleoutでの分散トランザクションの2フェーズ・コミットのプロトコルの実装を示しています。

図6-1 2フェーズ・コミットのプロトコル

図6-1の説明が続きます
「図6-1 2フェーズ・コミットのプロトコル」の説明

2フェーズ・コミットの障害分析

未処理の分散トランザクションのデータベースの操作に影響を与える可能性がある潜在的な障害には、複数のタイプがあります。表6-3は、これらの障害のタイプの概要を示し、TimesTen Scaleoutによる障害への対応について説明します。

表6-3 分散トランザクションの障害タイプ

障害 処置

トランザクション・マネージャに障害が発生します。

トランザクション・マネージャに障害が発生した(アプリケーションが終了したなど)場合は、そのインスタンスのメイン・デーモンが障害を捕捉し、サブデーモンに通知します。サブデーモンは、トランザクションの状態に応じて、すべての参加者にコミットまたはロールバック・メッセージを送信します。

トランザクション・マネージャのホストに障害が発生します。

トランザクション・マネージャのホストに障害が発生すると、デーモンおよびすべてのサブデーモンに障害が発生します。各参加者は、トランザクション・マネージャへのTCP接続が閉じられるか、またはタイムアウトになったときにこの障害を認識します。

参加者は、障害を認識すると、準備フェーズに到達していないトランザクションをロールバックします。参加者がすでにその準備レスポンスを送信した場合は、他の参加者にコミットの決定を依頼し、次のいずれかのアクションを実行します。

  • 他の参加者のうち少なくとも1つがコミットの決定を受信すると、依頼元の参加者が、コミットの決定を実現します。

  • 他の参加者がコミットの決定を受信しなかった場合、依頼元の参加者は、トランザクション・マネージャのリカバリを待機します。

コミットの準備ログ・レコードを書き込む前に、参加しているレプリカ・セットのすべての要素に障害が発生します。

トランザクション・マネージャが、トランザクションのロールバックを決定します。

コミットの準備ログ・レコードの書込み後に、参加者に障害が発生します。

参加者は、リカバリ後に、他の参加者のいずれかによるコミットの決定をリクエストします。

参加者がビジー状態です。

トランザクション・マネージャは、参加者から準備レスポンスを受信するまで待機します。