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でテーブルを作る際にカラムに重複を許さない制約(unique)を振ることがあると思います。 数字の場合は問題ないのですが、文字列の場合、なんと英語の大文字と小文字が区別されません。 つまりa …

no image

PostgreSQLについて

本日はポスグレ(PostgreSQL)について。 自分はほとんどMySQLだったので、主にMySQLとの比較について書いていきます。 Contents1 アーキテクチャの違い1.1 MySQL1.2 …

no image

Postgres リモートホストからの接続他

今まで使ってきたデータベースはMySQLがほとんどなのですが、最近少し、Postgresを触っています。 今回はパスワードの設定とリモートからの接続など。 Contents1 postgresへのログ …

no image

データベース設計のアンチパターン リトライ+バッチ分割+バッチの再利用不可

Contents1 リトライ1.1 デメリット1.2 対策2 バッチ分割2.1 デメリット2.2 対策3 バッチ再利用不可3.1 デメリット3.2 対策 リトライ ※OLTP=オンライントランザクショ …

no image

JPAまとめ

JPAわけわかんねーと思い、触りはじめてから3か月ぐらいたちます。 いまだに細かい部分はよくわかっていないことは多いのですが、全体像というか何となくどういうものかはわかり始めてきたいのでまとめたいと思 …