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での日付関数

MySQLでSUMやCOUNTなんかはよく使うと思うのですが、日付の関数なんかもかなり使います。 今回は、日付の日数をとりたいときの関数を紹介。 例えばあるカラムにある日付が入力されており、現在との日 …

no image

テーブル設計に関するメリデメ

昨日も書いた記事なんですが、基本的に実装にしても設計にしてもこれが最強っていう手法はなくて(あったとしたら全員がそれを使うのでそもそも選択肢という概念がなくなる・・)メリットデメリットをしっかりと考慮 …

no image

HAVING句について NULL時の動き

HAVING句のNULLがあった時の挙動にたいしてメモリます。 COUNTの処理 対象上の列数を数えるのにCOUNTを使うと思いますが、COUNT(*)とCOUNT(列名)では動きが若干違っており、前 …

no image

サブクエリ 応用編

本日も引き続きサブクエリです。 前回とちょっと近いですが、下記のような歯抜けのテーブル(sales2)があるとします。 year | sale ——+—&#8212 …

no image

CASE式のすすめ その2

本日も「達人に学ぶSQL徹底指南書」を地道に進めていきます。 Contents1 CASE式の利用2 UPDATE文のCASE3 テーブル同士のマッチング CASE式の利用 私自身はCHECK制約を使 …

アーカイブ