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

SQL結合 サブクエリに関して

今回はサブクエリに関してです。 もちろんSQL実践入門を読み進めています。 SQL上ではテーブル、ビュー、サブクエリというのは機能的にはそれほど変わらず主にパフォーマンスの点で違いがでてきます。 以下 …

no image

データベース設計のアンチパターン 複数表結合,大作SQL,Blob型の乱用

データベースのアンチパターンに関して。 以前下記ブログでも書いたんですが設計のスキルに関してもう少し身に着ける必要があるとおもい、チェックします。 論理設計のグレーノウハウ サロゲートキー 論理設計の …

no image

自己結合のイメージ

前回に引き続き結合について考えます。 例えば下記のようなテーブルがあり、重複行を削除するとします。 1 りんご 50 2 みかん 100 3 みかん 100 4 みかん 100 5 バナナ 80 この …

no image

GlassFishでDB接続

JavaEEではアプリケーションサーバーとしてGlassFishを使いますが、先日、GlassFishを通さないとJavaEEでDBが動かせないということを知りました。そのためJavaEEではデータベ …

no image

サブクエリの使い方

以前も少し学習しましたが、今回からはサブクエリの扱い方です。特に異なった行の比較(年度計算など)に関して行われる自己結合をつかったものが非常に強力です。 例によってここを学習しています。 下記のような …