技術要素 - 9.データベース - 4.トランザクション処理 - 1.同時実行制御(排他制御)

Last Update : April 14 2021 15:20:10

     

a. 同時実行制御(排他制御)

あるデータベースで1つのデータ資源を複数の異なるトランザクションがほぼ同時に更新しようとした場合に、「排他制御」が必要となります。この方法には以下のものがあります。

  • ロック方式
    データ資源にロック(鍵前)をかけて、別のトランザクションが処理を行えないようにする。
    ロックによる注意点としては、「デッドロック」があります。これは、複数のトランザクションが互いに資源の開放を待ちあう形になり、その時点から処理がストップしてしまうことを言います。
    • 占有ロック・・・他の処理からのロックや更新、削除、照会を禁止するロック
    • 共有ロック・・・他の処理からの更新や削除を禁止し、照会は許可するロック

    ロック粒度
    ロック粒度とは、ロックをかける単位(範囲)のこと。ロックをかけることのできる数とロックをかけることのできるデータ領域の大きさを示すもの。
    ロック粒度の大きさには、レコード、ページ、テーブル、データベース全体などがある。
    粗いロック粒度の場合、同時にロックできる数は少なくなるが、大きなデータ領域をロックすることができる。
    細かいロック粒度の場合、ロックできる数は多くなるが、小さいデータ領域しかロックすることができない。
    複数のプログラムが並行して動作する場合、粗いロック粒度では、占有するデータ領域が重なることで資源の競合が起こりやすく、ロック待ち時間が増大することで全体の処理が遅くなる。細かいロック粒度では、資源の競合は起こりにくいが、トランザクションによるロック数が多くなるためデッドロックが起こりやすくなる。

    デッドロックの発生を予防するには、
    ●占有ロックする資源の粒度(ロックする範囲)を小さくする
        他のタスクがロックした個所をアクセスする確率が小さくなる
    ●占有ロックをアクセスする時間を短縮する
        他のタスクとの同時アクセスが発生する確率が小さくなる
    ●ロックする資源の順序を同じにする
        タスクAもタスクBも、資源a→資源bの順にすればデッドロックになりにくい


  • セマフォ方式
    対象となる資源についてセマフォ変数という変数を設定し、その変数の値により、他のタスクにこの資源の利用を許すか禁止するかを示します。そして、P操作(Down)とV操作(Up)によりセマフォ変数の値を変化させます。
    • P操作
      資源を利用するために確保する操作。セマフォ変数から -1 する。その結果、
         セマフォ変数≧ 0 :タスクが資源を確保する
         セマフォ変数< 0 :タスクを待ち状態にする
    • V操作
      資源を解放する操作。セマフォ変数に +1 する。その結果、
         セマフォ変数> 0 :資源待ち他のタスクがないので何もしない
         セマフォ変数≦ 0 :待ち状態のタスクから一つのタスクを実行可能状態にする

    (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) と同じ状態に戻る。


b. コミットメント制御

データベースのデータ更新作業などで、トランザクションの処理が正常に終了し、更新された状態を確定することをコミットという。
データベースに対する確定の指示をコミットメントという。
トランザクションの処理が正常に終了しなかった場合は、コミットすることができないので、途中まで更新したものを処理開始前の状態に戻す必要がある。この元に戻す処理をロールバックという。
これらの処理をコミットメント制御と呼ぶ。

1相コミットメント
1つのデータベース内の複数データに対して1つのトランザクション処理でのコミットメントに対応する制御方法

2相コミットメント
1つのトランザクション内で複数のデータベースの更新において、それぞれのデータベースの更新処理の結果をすぐにコミットせず、コミットメントする前にそれぞれのデータベースの結果を確認する状態(セキュア状態)にしておいて、複数のデータベースのすべてが正常に終了したと確認できたときに、すべてのデータベースのコミットメントを行う。 どれか一つでも更新できなければ、すべてのデータベースをロールバックするという処理を2相コミットメントという。

分散データベース環境において、複数のシステム間で整合を保ちながら更新するための制御方式。
第1フェーズと第2フェーズからなる。
(1) 第1フェーズ
マスター(コミット指示を最初に受けたコンピュータ)は、更新対象となるデータを保有する全てのシステムに対しコミットの可否を問い合わせる。
各システムは、コミットの準備ができればコミットOKを応答する。
なおこの時点では、各システムは、処理を完了(コミット)することも、元の状態に戻す(ロールバック)することもできるセキュアな状態にある。
(2) 第2フェーズ
マスターが、第1フェーズの結果を見て、処理をコミットするかロールバックするかを決定する。
各システムからの応答がすべてOKであれば、当然各システムに対しコミット実行を指示するが、1つでもNO(または無応答)がある場合、ロールバックを指示する。
各システムは、実行を完了した後、マスターに応答する。
ただし、指示を出す直前にマスターに障害が発生すると、マスターが回復するまで、各システムはコミットもロールバックも行えない状態になる。
また、指示後にあるシステムに障害があった場合には、システム間でデータの不整合が発生することとなる。
※ セキュア状態は、マスターからの命令に応じて、コミットもロールバックも可能な状態である。


  [ 例題 ] 
  1. 平成30年度秋期 問29  ロック粒度
  2. 平成28年度春期 問30  排他制御
  3. 平成26年度秋期 問30  排他制御
  4. 平成25年度春期 問30  排他制御
  5. 平成24年度春期 問33  排他制御
  6. 平成22年度春期 問32  排他制御
  7. 平成20年度春期 問59  排他制御
  8. 平成20年度秋期 問60  排他制御
  9. 平成19年度春期 問29  セマフォ
  10. 平成18年度春期 問59  排他制御


     

www.it-shikaku.jp