8-12 同時実行制御

同時実行制御の必要性

 異なるトランザクションが同じ資源(DB)を競合するとき、何も制御を行わなければ更新結果に不整合が生じる恐れがあります。

この場合、結果はどうなるでしょうか?90でしょうか?80でしょうか?
これれが不整合が生じている状態です。このように不整合が生じないためにロック機能があります。

データの不整合を防ぐため、排他制御(どちらか一方が使用している間、他方は使用できない)では、トランザクション A が先にアクセスした場合、在庫データをロックします。

トランザクションAの処理が終わった後、ロックを解除(アンロック)し、トランザクション Bの処理を開始します。

これであたかも同時に実行されている状態になります。この制御方式を「同時実行制御」とよびます。

 

ロックの種類

共有ロック

データを参照(見るだけ)する時だけにかけるロックの方法です。
共有ロック中は他のトランザクションからもデータを参照することができますが、ロックしているので更新はできません

占有ロック

データを更新(変更・削除)するときにかけるロックの方法です。
占有ロック中は他のトランザクションでデータを参照することもできなくなります。つまり、そのトランザクションだけが触れるようになる状態です。

複数のトランザクションが共有ロックや占有ロックをかけようとした時の処理は以下の表のようになります。

 

デッドロック

 英語だと「行き詰まり、手詰まり、膠着状態」などの意味を持つようですが、ITの世界においては、複数の実行中のプログラムなどが互いに他のプログラムの結果待ちとなり、待機状態に入ったまま動かなくなる現象を指します。

 先ずは正常時の動きです。二つのトランザクションが同じテーブルに対して更新処理をしようとします。この時、先にロックしたトランザクションの処理が終わるまで、もう一つが処理を待ち、アンロックされたタイミングで処理を開始することで、データ処理は正常に終了することができます。

デッドロック(異常時)の動きですが、これは二つのトランザクションが別々のテーブルのデータを先にロックし、次の処理でそれぞれのトランザクションがそのロックされたデータを処理する流れになっています。この場合、それぞれのデータが解放されるのを待って、解放され次第処理を進めるのですが、お互い解放しないので、次の処理へ進めない状態になってしまいます…

デッドロック発生時の対処法は?

このデッドロックが発生してしまうとトランザクションが止まってしまうので、DBMSではデッドロックを検出し、一方のトランザクションの処理を中止し、ロールバック(データを前に戻す)することで復旧させます。

また、デッドロックが発生しないようにするためにも、複数のトランザクションにおいて、データの呼び出し順序を同じにするなどの方法があります。