MySQLのロックに関して+サブクエリ内のupdate

    最終更新日:2017/03/15

MySQLのロックに関して。

データベースではデータの整合性を保つために読み書きを一時的に制限する仕組みがあります。(データベースだけではないですが・・・)

大きく分けると共有ロック(書き込みは当然だめだけど、読み取りはOK)と排他ロック(読み取りもダメ)の2種類があります。

http://tech.feedforce.jp/mysql.html

またテーブルロックと行ロックという違いもあります。

http://www.insight-tec.com/mailmagazine/ora3/vol054.html

ロック待ちtimeout

このロックを待っていてtimeoutしてしまうことがあります。

Lock wait timeout exceeded・・・のようなエラーメッセージが画面にでているかと思います。

この場合、行ロックではなくテーブルロックになっていることが原因なことが多いです。

id指定などの行に対するロックであればロック待ちは基本発生しないからです。

http://blog.katty.in/3082

http://fujiiyuuki.blogspot.jp/2010/09/mysql.html

http://a23187.yorozuyah.com/blog/?p=951

その他

http://qiita.com/mizzwithliam/items/31fb68217899bd0559e8

サブクエリでのupdate

MySQLでは同じテーブルに対するサブクエリからの操作ができません。

例えば下記のようなSQLが通らず
ERROR 1093 (HY000): You can’t specify target table ‘reportitems’ for update in FROM clauseというエラーがでてしまいます。

この場合、サブクエリ内をテーブルとみてあげれば大丈夫です。

http://blogger.shase.info/2014/09/mysqlerror1093.html

  • このエントリーをはてなブックマークに追加
  • Pocket

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。