Hatena::ブログ(Diary)

EC-One ナレッジセンター レスキューサービス ブログ

2009-11-14

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

f:id:EC-One:20091112200615j:image

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

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


f:id:EC-One:20090805110551g:image MySQLのロック

数年前までは、EC-Oneが業務システムを開発する場合に、DBOracleを使用することが多かったです。
ODBが適する業務の場合は別ですが、RDBが適する業務の場合のOracleの使用率はダントツ。

そのため、Oracle以外のRDBを使用する場合でも、最初のうちは「DB2はOracleとここが違う」等、Oracleとの比較で理解/説明しようとする事が多かったです。
そんな中で出会ったMySQLのハマりポイントをご紹介します。

f:id:EC-One:20090805110551g:image MySQLって行ロックじゃないの?

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

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

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

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




JavaRuby及び周辺のソフトウェアを用いた開発に関して、企業があらゆる悩みごとを相談できるのが、ナレッジセンターの「レスキューサービス」です。

どんな相談でも親身に受け付けますので、レスキューサービスってなに?もっと知りたい!と思った方はお気軽に問い合わせ下さい。

問い合わせ画像リンク

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証