032 MySQLのはまりどころ(その1)〜行ロックのつもりでテーブルロック


こんにちは、id:EC-OneのAkiです。

なかなか技術ネタが書けない今日この頃ですが、小ネタでもいいから書いてみようと思います。

MySQLのロック

数年前までは、EC-Oneが業務システムを開発する場合に、DBにOracleを使用することが多かったです。
ODBが適する業務の場合は別ですが、RDBが適する業務の場合のOracleの使用率はダントツ。
そのため、Oracle以外のRDBを使用する場合でも、最初のうちは「DB2Oracleとここが違う」等、Oracleとの比較で理解/説明しようとする事が多かったです。
そんな中で出会ったMySQLのハマりポイントをご紹介します。

MySQLって行ロックじゃないの?

MySQLを使用するといっても、そのエンジンにはInnoDBMyISAMがありますが、最近のデフォルトはInnoDBで、これは行ロックが基本となるエンジンです。
ちなみに、ちょっと前のMySQLはインストール時にMyISAMの方が有効になっており、MyISAMトランザクションに非対応なので期待した動作にならない(Rollbackしても値が戻らない)事がありました。

さて、行ロックのつもりでアプリを構築&テストしていたときのこと、「どうもテーブルロックになっているっぽい」との声が開発メンバから上がりました。
しかもそれが発生するのが特定のテーブルでだけという不思議な現象でした。

実はMySQL(InnoDB)は「当該テーブルにプライマリキーもユニークキーもない場合、ロックはテーブルロックとなる」のだったのです。
しかもそれはselect 〜 for update文のように「明示的に目的レコードだけをロックする」目的の場合でもやはりテーブルロックなのです。
文献を読めばわかること、かつ小さなことではありましたが、初めてMySQLを使用した我々には衝撃の事実だったわけです。これからMySQLを使用する方々は「行ロックとしたいテーブルにはプライマリキーまたはユニークキーを設ける」ようにご注意を!

ナレッジセンターでは、詳しく文献を読めばわかるかも知れないことや、使ったことがある人ならすぐわかるような小さなつまづきでも、ご質問いただければ親身に対応いたします。
トライアルで質問を無料で受け付けるキャンペーンも実施しておりますので、お気軽にお問い合わせ下さい!







JavaRuby及び周辺のソフトウェアを用いた開発に関して、企業があらゆる悩みごとを相談できるのが、ナレッジセンターの「レスキューサービス」です。
どんな相談でも親身に受け付けますので、レスキューサービスってなに?もっと知りたい!と思った方はお気軽に問い合わせ下さい。
問い合わせ画像リンク