データベースの行ロックとテーブルロック
Oracle, SQL server, PostgreSQL, MySQLなどのリレーショナルデータベースはロックという機能をサポートしていて、複数ユーザによる同じデータへのアクセスを保証しています。
ですが、各データベースでロックの仕組みは微妙な違いがあります。この辺の違いを理解していないとバッチ処理などで一つのトランザクションで大量のデータ更新を行う際に、はまりやすくなります。
↓表にしてみましたが、どれも基本行ロックで、明示的にテーブルロックにするなどのコマンドは用意されているので、ロック状態は任意に設定できます。
データベース | ロック | 備考 |
Oracle | 行ロック | どれだけロックが増えても行ロック。その分メモリを食う。参考。 |
SQL Server | 行ロック→テーブルロック | システムのリソースが少なくなると行ロックからテーブルロックに自動的に変更(ロックエスカレーション機能)。参考。MSDN。 SQL Server 2005 と Oracle 10g の真実 |
PostgreSQL | 行ロック | メモリ上に変更された行の情報を記憶しないので同時にロックできる行数に上限はない。ただしテーブルに書き込むため、定期的にVACUUMしてあげないといけない。 8.3では自動でVACUUMしてくれるらしい。wikipedia |
MySQL | MyISAM:テーブルロック InnoDB:行ロックとテーブルロック | MyISAMとInnoDB 詳細はこちら。 |
行ロックの利点と欠点がMySQLのサイトにあったのでメモ。
ほとんどの場合ロックを気にしなくても大丈夫ですが、IDの採番はちゃんとロックしないと重複したIDとなる場合がありえる(めったない)。
ちゃんとロックしないと駄目でしたー
とか
この処理のおかげで他の処理はみんなタイムアウト!
というのは運用後に発覚する場合がほとんどなので、はまると痛い。