スタートページWeb教材一覧データベース

2相コミット


2相コミットの用語

コミット(commit)
トランザクションによる更新を確定することです。トランザクションが到着しても処理に時間がかかりますし、他の先行トランザクションが同じ場所を更新中ならば待たされます。その間に異常が発生するかもしれません。「コミットした」とは、それらを無事通過して正常に更新ができた状態です。
2相コミット(Two-Phase Commit)
分散データベースで2つのデータベースA、Bを更新するとき、一方のデータベースが正常終了したのに他方のデータベースで異常終了したら一貫性が失われてしまいます。それを回避するには、すべてで成功すれば更新するし、少なくとも1つで失敗すれば、すべての更新をやめるようにする必要があります。それを2相コミットといいます。
それを実現するには、更新処理を「コミットできるか」を調べるコミット要求フェーズと実際に更新する(コミットする)コミットフェーズの2段階のフェーズ(相)で行います。それで2相コミットというのです。
参加者(cohort)と調整者(coordinator)
2相コミットの説明では、、参加者と調整者という用語を持ち込みます(当然、人間ではなく、更新を行うハードウェアやソフトウェアです)。
データベースA、Bを更新する場合では、Aの更新処理が参加者A、Bのの更新処理が参加者Bになります。
調整者とは、A・Bの状況を監視して2相コミットを行う制御ソフトウェアです。
UNDOレコードとREDOログ
UNDOとは「元に戻す」という意味です。主に変更したデータを元に戻す(ロールバックする)ために使われます。UNDO用の表領域を準備してそこにUNDOレコードを作成します。
REDOとは「再度同じ変更をする」という意味です。データベース破損時に、バックアップデータを最新のデータまで戻す再実行(リカバリ)のために使用するログで、ログを書く場所は専用ログファイルです。

2相コミットの動作

コミット要求フェーズ

  1. 調整者は、全参加者にコミットしてもよいかを問い合わせます。
  2. 各参加者は。トランザクションをコミットできる状態にします。
  3. 各参加者は、REDOログとUNDOレコードに情報を書き込みます。
  4. 各参加者は、調整者に、更新に成功すれば「合意」、失敗した場合は「停止」を応答します。
  5. 調整者は、全参加者から応答を受取るまで待ちます。

全参加者から「合意」を受け取ったらコミットフェーズ(成功)、ある参加者から「停止」を受け取ったらコミットフェーズ(失敗)に進みます。

コミットフェーズ(成功)

  1. 調整者は、全参加者に「コミットせよ」と指示します。
  2. 各参加者は、全ロックとリソースを解放して、操作を完了します。
  3. 各参加者は、調整者に「完了応答」を伝えます。
  4. 調整者が全参加者から完了応答を受け取った時点でコミットされた状態になります。

コミットフェーズ(失敗)

  1. 調整者は、全参加者に「ロールバックせよ」と指示します。
  2. 各参加者は、Undoログを使って以前の状態に戻し、全ロックとリソースを解放します。
  3. 各参加者は、調整者に「完了応答」を伝えます。
  4. 調整者が全参加者から完了応答を受け取った時点で更新無効の状態になります。

2相コミットの利点・欠点

利点
一つのトランザクションで複数のデータベースを更新する一連のプロセスを一つの単位として、コミットに成功したか失敗したかの結果になるので、一貫性の維持ができます。
失敗したときのロールバック処理が各データベースで独立に行えるので、処理が簡潔になります。
欠点
調停者に障害が発生すると,回復するまでの間,参加者全員がコミットもロールバックも行えない事態になることがあります。参加者のなかで応答ができない状態になった場合も同様です。
調整者が全参加者からの応答を待つ時間がかかります。特に参加者が遠隔地にありネットワーク接続されている場合は、通信に要する時間がかかりますし、通信障害のリスクもあります。
待ち時間の間は、更新されるデータベースがロックされた状態になります。多数のトランザクションを処理するときは排他制御により、効率が悪くなる欠点があります。

本シリーズの目次へ