目次へ

11.4. 排他制御

排他制御とは、あるトランザクションが実行中のときに、そのトランザクションが対象としているデータをロックし、他のトランザクションのアクセスを禁止することによって、データの整合性を確保しようとする仕組みです。トランザクションが完了すれば、ロックは解除され、他のトランザクションはデータにアクセスできるようになります。

例えば、あるお店の在庫管理テーブルに商品が 30個登録してあるとします。販売員 P さんが商品 A を 15個販売し、ほぼ同じ頃に販売員 Q さんが商品 A を 5個販売しました。このとき、二人の販売員が在庫管理テーブルのデータを更新しようと次のような処理を行ったとします。販売員 P さんは在庫テーブルから商品 A の個数を 15個マイナスし、販売員 Q さんは 5個マイナスします。このとき排他制御がない場合、販売員 P さんも販売員 Q さんも同じ在庫数 30個を読み取り、それぞれで処理を行います。その結果、次の図のように、商品 A の在庫数は 25個となり、販売員 P さんの処理は結果に反映されなくなり、データに不整合が生じます。

排他制御がない場合

排他制御が行われている場合は、販売員 P さんがトランザクションを開始したときに、データはロックされ販売員 Q さんはトランザクションを実行することができません。販売員 P さんが在庫数を 30個から 15個に更新し、トランザクションが終了した後に、販売員 Q さんは在庫数を 15個から 10個に更新することができるようになります。

排他制御が行われている場合

11.5. ロック

排他制御は、前節でも説明したように、データをロックすることにより実現することができます。また、データベースへのアクセスのパフォーマンスなどの観点から、排他制御の方法にはいくつかの方法があります。排他制御の形態は、ロックの形態に左右されます。ここでは、概念的な話になりますが、ロックの様々な形態について説明します。

ロックの形態は、そのロックの程度から分類すると共有ロックと排他ロックの 2 種類 (2 モード) があります。これはトランザクションの ACID 特性の一つである隔離性 (ISOLATION) のレベルにかかわってくるものです。

共有ロック
トランザクションが SELECT 文によりデータを参照するものであるときのロックのモードです。共有ロックによりデータがロックされている間は、他のトランザクションからデータを参照することはできますが、データの変更はできません。
 
排他ロック
トランザクションが INSERT 文、UPDATE 文及び DELETE 文であるときのロックのモードです。排他ロックされている間、他のトランザクションからデータの参照も変更もできません。

また、ロックするデータの範囲をロックの粒度またはロックレベルといいます。ロックするデータの範囲を、テーブル全体にするのか、行全体なのか、特定の列なのかを示すものです。同時実効性を高めるには、ロックの粒度は小さいほうが望ましいと言えますが、トランザクションが衝突する可能性が高くなるという欠点があります。逆に粒度が大きい場合は、トランザクションの衝突の可能性は減りますが、同時実効性が低くなってしまいます。

実行しようとするトランザクションが共有ロックであるのか、排他ロックであるのかは、後に述べる SET TRANSACTION 文で指定することができます。ロックの粒度も同じ構文で指定することができます。

データのロックにより発生するものに、デッドロックというものがあります。これは複数のトランザクションが互いの処理に必要なデータをロックし合っているために、処理不能の状態になってしまうことです。図のように、トランザクション A がトランザクション B がロックしているデータ B を参照し、トランザクション B はトランザクション A がロックしているデータ A を参照しようとし、双方のトランザクションがデータロック解除待ち状態になってしまいます。

デッドロック

デッドロックを防ぐには、トランザクションを設計するときに、アクセスするデータの順を決めておくことがよいとされています。つまり、トランザクション A ではデータ A の次にデータ B を処理するという風にするならば、トランザクション B でもデータ A の次にデータ B を処理するという風にすればよいというわけです。

デッドロックを防ぐ方法として、二相ロック方式という考え方もあります。これは、あるトランザクションが処理対象としているデータのすべてを、トランザクションの開始時にまとめてロックしてしまい、トランザクションが終了する直前にそのロックをすべて開放するというものです。二相ロック方式によりロックされたデータは、トランザクションで処理中でないデータに対しても、他のトランザクションはデータの変更などの処理をすることができなくなるのです。

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp