データベースの運用と管理の基本
テーブルのロック
複数のユーザーが1つのデータベースを操作する場合、2人以上のユーザーが同時に同じテーブルのデータを追加/更新することが起こり得ます。これにより、データの整合性が失われてしまう場合があります。
例えば、ある時点で、商品Aの在庫が10個だったとします。ここで、2人のユーザーが商品のテーブルを同時に更新し、それぞれが在庫を1個減らす処理を行ったとします。このとき、仮に図2のような順序で処理が行われたとすると、本来なら在庫が2個減らなければならないところで、在庫が1個しか減らないという現象が起こってしまいます。
このようなことを防ぐには、「ロック」(lock)と呼ぶ機能を使います。ロックには、以下の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ごとの差異が比較的大きいです。