データベースの運用と管理の基本

2009年10月27日(火)
藤本 壱

テーブルのロック

複数のユーザーが1つのデータベースを操作する場合、2人以上のユーザーが同時に同じテーブルのデータを追加/更新することが起こり得ます。これにより、データの整合性が失われてしまう場合があります。

例えば、ある時点で、商品Aの在庫が10個だったとします。ここで、2人のユーザーが商品のテーブルを同時に更新し、それぞれが在庫を1個減らす処理を行ったとします。このとき、仮に図2のような順序で処理が行われたとすると、本来なら在庫が2個減らなければならないところで、在庫が1個しか減らないという現象が起こってしまいます。

このようなことを防ぐには、「ロック」(lock)と呼ぶ機能を使います。ロックには、以下の2種類があります。

  1. 排他ロック --- 他のユーザーが書き込み/読み出しともできないようにする
  2. 共有ロック --- 他のユーザーは書き込みできないようにする(読み込みは可)

図2の例では、ユーザーAが処理を始める前に、まず商品のテーブルをロックします。そして、在庫の更新が終わったら、商品テーブルのロックを解除します。

こうすれば、ユーザーAが商品テーブルを操作している間は、ユーザーBは商品テーブルを操作することができなくなり、商品テーブルのロックが解除されるのを待つ状態になります。その結果、図2のような問題は発生しなくなります。

ストアド・プロシージャとトリガ

多くのRDBMSには、「ストアド・プロシージャ」(stored procedure)と呼ぶ機能があります。ストアド・プロシージャは、RDBMSの内部でプログラムを実行して、一連の処理をRDBMS内で完結させる機能です。

RDBMSとアプリケーション・ソフトは、処理を分担しながら動作します。アプリケーション・ソフトはRDBMSに対してSQLを発行し、その結果を受け取って処理を進めます。ただし、SQLを発行する回数が多くなると、RDBMSとアプリケーション・ソフトとの間の通信量が多くなり、システムのパフォーマンスが落ちます。

そこで、複数のSQLからなる処理をストアド・プロシージャとしてまとめ、RDBMS側で実行します。これにより、RDBMSとアプリケーションとの間の通信量が減り、システムのパフォーマンスが向上する場合があります。

ストアド・プロシージャの一種のような機能として、「トリガ」(trigger)もあります。トリガは、行の追加や削除などの特定のタイミングで、RDBMS内でプログラムを実行する機能です。

例えば、あるテーブルから行を削除した際に、そのテーブルと結合するほかのテーブルから、関連する行を自動的に削除する、といった処理をトリガで行うことができます。

一度に複数の行が操作の対象になる場合のトリガの処理は、RDBMSによって異なっています。テーブル全体に対して1回トリガを実行する製品もあれば、対象になった行ごとに複数回トリガを実行する製品もあります。

なお、ストアド・プロシージャやトリガは、SQLを拡張した構文で記述します。この構文は、RDBMSごとの差異が比較的大きいです。

1969年生まれ。神戸大学工学部電子工学科卒。ソフトメーカー勤務後、フリーライターとして独立。現在では、パソコン関係およびマネー関係の書籍を中心に執筆活動を行っている。ブログ「The blog of H.Fujimoto」は、Movable TypeやWordPressの情報を中心に毎日更新している(http://www.h-fj.com/blog/)。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています