・トランザクション:データベースに対する一連の処理をまとめたもの
・同時実行制御(排他制御):複数のトランザクションに対し、データの整合性(一貫性)を保つための機能
・デッドロック:排他制御により複数のトランザクションがロックの解除を待ち続ける状態
[復習]トランザクションとは?
トランザクションとは、データベースに対する一連の処理を1つにまとめたものです。
受注時に在庫データベースの在庫データを更新する処理を考えます。このとき、在庫データベースでは、次の処理を実施します。
②在庫数の更新(受注した個数を在庫から差し引く)
この①と②のように、一連の処理を合わせたものがトランザクションです。
同時実行制御(排他制御)とは?
同時実行制御(排他制御)とは、データベースに複数トランザクションがあった場合、データの整合性(一貫性)を保つための機能です。
データベースにアクセスがあった場合、ロックすることで同時実行制御(排他制御)を実現します。
例えば、トランザクションAとトランザクションBが在庫データに同時にアクセスした場合を想定してみます。
同時実行制御(排他制御)がなければ、次のような処理になります。
①在庫数を参照:100
②在庫数を更新:100-10=90
トランザクションB
①在庫数を参照:100
②在庫数を更新:100-20=80
⇒在庫数=90? 80?
同時実行制御(排他制御)を行わない場合、処理のタイミングにより在庫数の不整合(90or 80?)が起こります。
データの不整合を防ぐため、排他制御では、トランザクション A が先にアクセスした場合、在庫データをロックします。
トランザクションAの処理が終わった後、ロックを解除(アンロック)し、トランザクション Bの処理を開始します。
●在庫データロック
①在庫数を参照:100
②在庫数を更新:100-10=90
●在庫データアンロック
トランザクションB
●在庫データロック
①在庫数を参照:90
②在庫数を更新:90-20=70
●在庫データアンロック
⇒在庫数=70
このようにデータの整合性(一貫性)を保つため、ロックによる同時実行制御(排他制御)を行っています。
デッドロック
デッドロックとは、排他制御により複数のトランザクションがロック解除(アンロック)を待ち続ける状態です。
具体的に、トランザクションAとBでデッドロックを説明していきます。
①在庫aを参照
②在庫aを更新
③在庫bを参照
④在庫bを更新
トランザクションB
①在庫bを参照
②在庫bを更新
③在庫aを参照
④在庫aを更新
●在庫aのロック
①在庫aを参照
②在庫aを更新
●在庫bのアンロック待ち
(③在庫bを参照)
(④在庫bを更新)
トランザクションB
●在庫bのロック
①在庫bを参照
②在庫bを更新
●在庫aのアンロック待ち
(③在庫aを参照)
(④在庫aを更新)
排他制御では、トランザクションAが在庫aにアクセスした時点で、在庫aをロックします。一方、トランザクションBは在庫bにアクセスするので、在庫bもロックします。
トランザクションAでは、在庫aの更新を完了しても、在庫bにアクセスできないため、トランザクションAを終了できません。
また、トランザクション B も同様に、在庫bを更新した後、 在庫aへアクセスできないので、終了できません。
このように排他制御により、永遠にトランザクションを終了できない状態をデッドロックと呼びます。
【まとめ】同時実行制御(排他制御)とデッドロック
それでは最後におさらいをしておきましょう!
用語 | 説明 |
---|---|
トランザクション | 関連する一連の処理をまとめたもの |
同時実行制御 (排他制御) | データへ複数のアクセスがあった場合、データの整合性(一貫性)を保つ機能 データをロックすることで実現 |
デッドロック | 同時実行制御(排他制御)により、複数のトランザクションがロックの解除を待ち続ける状態 |
コメント