032 MySQLのはまりどころ(その1)〜行ロックのつもりでテーブルロック
こんにちは、id:EC-OneのAkiです。
なかなか技術ネタが書けない今日この頃ですが、小ネタでもいいから書いてみようと思います。
MySQLのロック
数年前までは、EC-Oneが業務システムを開発する場合に、DBにOracleを使用することが多かったです。
ODBが適する業務の場合は別ですが、RDBが適する業務の場合のOracleの使用率はダントツ。
そのため、Oracle以外のRDBを使用する場合でも、最初のうちは「DB2はOracleとここが違う」等、Oracleとの比較で理解/説明しようとする事が多かったです。
そんな中で出会ったMySQLのハマりポイントをご紹介します。
MySQLって行ロックじゃないの?
MySQLを使用するといっても、そのエンジンにはInnoDBとMyISAMがありますが、最近のデフォルトはInnoDBで、これは行ロックが基本となるエンジンです。
ちなみに、ちょっと前のMySQLはインストール時にMyISAMの方が有効になっており、MyISAMはトランザクションに非対応なので期待した動作にならない(Rollbackしても値が戻らない)事がありました。
さて、行ロックのつもりでアプリを構築&テストしていたときのこと、「どうもテーブルロックになっているっぽい」との声が開発メンバから上がりました。
しかもそれが発生するのが特定のテーブルでだけという不思議な現象でした。
実はMySQL(InnoDB)は「当該テーブルにプライマリキーもユニークキーもない場合、ロックはテーブルロックとなる」のだったのです。
しかもそれはselect 〜 for update文のように「明示的に目的レコードだけをロックする」目的の場合でもやはりテーブルロックなのです。
文献を読めばわかること、かつ小さなことではありましたが、初めてMySQLを使用した我々には衝撃の事実だったわけです。これからMySQLを使用する方々は「行ロックとしたいテーブルにはプライマリキーまたはユニークキーを設ける」ようにご注意を!
ナレッジセンターでは、詳しく文献を読めばわかるかも知れないことや、使ったことがある人ならすぐわかるような小さなつまづきでも、ご質問いただければ親身に対応いたします。
トライアルで質問を無料で受け付けるキャンペーンも実施しておりますので、お気軽にお問い合わせ下さい!
関連エントリ
- 002 ナレッジセンター レスキューサービスって?
- 003 ある日のナレッジセンターへの質問「IE8対応ってどうやるの?」
- 009 イーシー・ワン、企業向けに「ナレッジセンターレスキューサービス」を提供開始!
Java、Ruby及び周辺のソフトウェアを用いた開発に関して、企業があらゆる悩みごとを相談できるのが、ナレッジセンターの「レスキューサービス」です。
どんな相談でも親身に受け付けますので、レスキューサービスってなに?もっと知りたい!と思った方はお気軽に問い合わせ下さい。