Distributed-dbms-commit-protocols

提供:Dev Guides
移動先:案内検索

分散DBMS-コミットプロトコル

ローカルデータベースシステムでは、トランザクションをコミットするために、トランザクションマネージャはリカバリマネージャにコミットする決定を伝えるだけです。 ただし、分散システムでは、トランザクションマネージャーは、トランザクションが実行されているさまざまなサイトのすべてのサーバーにコミットする決定を伝え、決定を一律に実施する必要があります。 各サイトで処理が完了すると、部分的にコミットされたトランザクション状態に到達し、他のすべてのトランザクションが部分的にコミットされた状態に達するまで待機します。 すべてのサイトがコミットする準備ができているというメッセージを受信すると、コミットを開始します。 分散システムでは、すべてのサイトがコミットするか、いずれのサイトもコミットしません。

さまざまな分散コミットプロトコルがあります-

  • 単相コミット
  • 二相コミット
  • 三相コミット

分散1フェーズコミット

分散1フェーズコミットは、最も単純なコミットプロトコルです。 トランザクションが実行されている制御サイトといくつかのスレーブサイトがあると考えてみましょう。 分散コミットの手順は次のとおりです-

  • 各スレーブは、トランザクションをローカルで完了した後、制御サイトに「DONE」メッセージを送信します。
  • スレーブは、制御サイトからの「コミット」または「中止」メッセージを待ちます。 この待ち時間は「脆弱性の窓」と呼ばれます。
  • 制御サイトが各スレーブから「DONE」メッセージを受信すると、コミットするか中止するかを決定します。 これはコミットポイントと呼ばれます。 次に、このメッセージをすべてのスレーブに送信します。
  • このメッセージを受信すると、スレーブはコミットまたはアボートし、確認メッセージを制御サイトに送信します。

分散2フェーズコミット

分散2フェーズコミットは、1フェーズコミットプロトコルの脆弱性を軽減します。 2つのフェーズで実行される手順は次のとおりです-

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

  • 各スレーブは、トランザクションをローカルで完了した後、制御サイトに「DONE」メッセージを送信します。 制御サイトは、すべてのスレーブから「DONE」メッセージを受信すると、「Prepare」メッセージをスレーブに送信します。
  • 奴隷はまだコミットしたいかどうかに投票します。 スレーブがコミットしたい場合、「準備完了」メッセージを送信します。
  • コミットしたくないスレーブは、「準備ができていません」メッセージを送信します。 これは、スレーブで競合する同時トランザクションがある場合、またはタイムアウトが発生した場合に発生する可能性があります。

フェーズ2:コミット/中止フェーズ

  • 制御サイトがすべてのスレーブから「準備完了」メッセージを受信した後-
  • 制御サイトは「グローバルコミット」メッセージをスレーブに送信します。
  • スレーブはトランザクションを適用し、「コミットACK」メッセージを制御サイトに送信します。
  • 制御サイトは、すべてのスレーブから「Commit ACK」メッセージを受信すると、トランザクションがコミットされたと見なします。
  • 制御サイトが最初の「Not Ready」メッセージをスレーブから受信した後-
  • 制御サイトはスレーブに「Global Abort」メッセージを送信します。
  • スレーブはトランザクションを中止し、制御サイトに「Abort ACK」メッセージを送信します。
  • 制御サイトは、すべてのスレーブから「ACKの中止」メッセージを受信すると、トランザクションが中止されたと見なします。

分散三相コミット

分散三相コミットの手順は次のとおりです-

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

手順は、分散2フェーズコミットの場合と同じです。

フェーズ2:コミットフェーズの準備

  • 制御サイトは、「準備状態に入る」ブロードキャストメッセージを発行します。
  • 応答として、スレーブサイトは「OK」と投票します。

フェーズ3:コミット/中止フェーズ

手順は2フェーズコミットと同じですが、「Commit ACK」/「Abort ACK」メッセージは不要です。