あるデータベースで1つのデータ資源を複数の異なるトランザクションがほぼ同時に更新しようとした場合に、「排他制御」が必要となります。この方法には以下のものがあります。
【 ロック粒度 】
ロック粒度とは、ロックをかける単位(範囲)のこと。ロックをかけることのできる数とロックをかけることのできるデータ領域の大きさを示すもの。
ロック粒度の大きさには、レコード、ページ、テーブル、データベース全体などがある。
粗いロック粒度の場合、同時にロックできる数は少なくなるが、大きなデータ領域をロックすることができる。
細かいロック粒度の場合、ロックできる数は多くなるが、小さいデータ領域しかロックすることができない。
複数のプログラムが並行して動作する場合、粗いロック粒度では、占有するデータ領域が重なることで資源の競合が起こりやすく、ロック待ち時間が増大することで全体の処理が遅くなる。細かいロック粒度では、資源の競合は起こりにくいが、トランザクションによるロック数が多くなるためデッドロックが起こりやすくなる。
デッドロックの発生を予防するには、
●占有ロックする資源の粒度(ロックする範囲)を小さくする
他のタスクがロックした個所をアクセスする確率が小さくなる
●占有ロックをアクセスする時間を短縮する
他のタスクとの同時アクセスが発生する確率が小さくなる
●ロックする資源の順序を同じにする
タスクAもタスクBも、資源a→資源bの順にすればデッドロックになりにくい
(1) 初期状態では、資源はどのタスクにも使われていない。セマフォ変数= 1 にしておく。
(2) タスク A が資源を要求。P操作(-1)が行われる。その結果、セマフォ変数 : 0 ≧ 0 なので、タスク A は資源を確保して、実行状態になる。
(3) タスク B が資源を要求。P操作(-1)が行われる。その結果、セマフォ変数 : -1 < 0 なので、タスク B は、資源が解放されるまで待つ。
(4) タスク C が資源を要求。P操作(-1)が行われる。その結果、セマフォ変数 : -2 < 0 なので、タスク C は、資源が解放されるまで待つ。
(5) タスク A の実行が終了したので、資源を解放しV操作(+1)が行われる。その結果、セマフォ変数 : -1 ≦ 0 なので、待ち状態のタスクからタスク B が実行可能状態になり実行に入る。
(6) タスク B の実行が終了したので、資源を解放しV操作(+1)が行われる。その結果、セマフォ変数 : 0 ≦ 0 なので、待ち状態のタスクからタスク C が実行可能状態になり実行に入る。
(7) タスク C の実行が終了したので、資源を解放しV操作(+1)が行われる。その結果、セマフォ変数 : 1 > 0 なので、何もせず (1) と同じ状態に戻る。
データベースのデータ更新作業などで、トランザクションの処理が正常に終了し、更新された状態を確定することをコミットという。
データベースに対する確定の指示をコミットメントという。
トランザクションの処理が正常に終了しなかった場合は、コミットすることができないので、途中まで更新したものを処理開始前の状態に戻す必要がある。この元に戻す処理をロールバックという。
これらの処理をコミットメント制御と呼ぶ。
【 1相コミットメント 】
1つのデータベース内の複数データに対して1つのトランザクション処理でのコミットメントに対応する制御方法
【 2相コミットメント 】
1つのトランザクション内で複数のデータベースの更新において、それぞれのデータベースの更新処理の結果をすぐにコミットせず、コミットメントする前にそれぞれのデータベースの結果を確認する状態(セキュア状態)にしておいて、複数のデータベースのすべてが正常に終了したと確認できたときに、すべてのデータベースのコミットメントを行う。
どれか一つでも更新できなければ、すべてのデータベースをロールバックするという処理を2相コミットメントという。
分散データベース環境において、複数のシステム間で整合を保ちながら更新するための制御方式。
第1フェーズと第2フェーズからなる。
(1) 第1フェーズ
マスター(コミット指示を最初に受けたコンピュータ)は、更新対象となるデータを保有する全てのシステムに対しコミットの可否を問い合わせる。
各システムは、コミットの準備ができればコミットOKを応答する。
なおこの時点では、各システムは、処理を完了(コミット)することも、元の状態に戻す(ロールバック)することもできるセキュアな状態にある。
(2) 第2フェーズ
マスターが、第1フェーズの結果を見て、処理をコミットするかロールバックするかを決定する。
各システムからの応答がすべてOKであれば、当然各システムに対しコミット実行を指示するが、1つでもNO(または無応答)がある場合、ロールバックを指示する。
各システムは、実行を完了した後、マスターに応答する。
ただし、指示を出す直前にマスターに障害が発生すると、マスターが回復するまで、各システムはコミットもロールバックも行えない状態になる。
また、指示後にあるシステムに障害があった場合には、システム間でデータの不整合が発生することとなる。
※ セキュア状態は、マスターからの命令に応じて、コミットもロールバックも可能な状態である。
www.it-shikaku.jp