PR

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

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のWebサイトにログインすることでさまざまな限定特典を入手できるようになります。

Think IT会員サービスの概要とメリットをチェック

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