skillup

技術ブログ

Database

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

投稿日:2017年2月14日 更新日:

MySQLのロックに関して。

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

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

MySQL ロックの話

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

ロックに関する検証 その1

ロック待ちtimeout(Lock wait timeout exceeded)

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

トランザクションのスタートからコミットまでの間の処理が長く、この間に強制終了した時などはLock wait timeout exceeded・・・のようなエラーメッセージが出て、以降のDBへの書き込みができないときがあります。

解除方法としてはMySQLにログインしてロックされているプロセスを消すことになります。

プロセスを強制終了する

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

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

ロック待ちでハマる前に知りたかったMySQL InnoDBの行ロックとテーブルロックの挙動

MySQLのトランザクションとロック

MySQLのInnoDBでLock待ちのSQLを調べる

その他

MySQL – InnoDBのロック関連まとめ

サブクエリでのupdate

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

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

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

MySQLでERROR:1093を回避する

-Database
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

MySQLでのlocalhostと127.0.0.1の違い

たまにMySQLでローカルのホストに接続する時に、localhostで接続するときと127.0.0.1で接続するときで挙動が違う(片方だとエラーになり、もう片方だとエラーにならない)などがあるのでちょ …

no image

外部結合 応用編2

引き続き結合についてです。 Contents1 1対Nの結合に関して2 完全外部結合3 差集合(class_aだけに存在するものとclass_bだけに存在するもの)3.1 class_aのみ3.2 c …

no image

SQL サブクエリ

前回の問題をサブクエリを使って解きます。前年度の売上を出すのが一番難しいので、それを出す方法です。MySQLだとそもそも分析関数が存在しないので・・ [crayon-5f68c7271e0897707 …

no image

論理設計のグレーノウハウ 列持ちテーブル、集計キー、多段ビュー

前回に引き続き論理設計のグレーノウハウについて。 Contents1 列持ちテーブル1.1 メリット1.1.1 シンプルな設計1.1.2 入出力のフォーマットと合わせやすい1.2 デメリット1.2.1 …

no image

Firebaseでのミニアプリデプロイ

KVS的なDBを使うかもしれず、firebaseの復習をしております。以前、firebaseのサンプルなどちょこちょこ動かしましたが、firebaseに登録をしただけでデプロイまではしておりませんでし …