mysql テーブルロック&行ロックまとめ

よく忘れるのでメモ

InnoDBで行ロック/テーブルロックになる条件 - (゚∀゚)o彡 sasata299's blog
MyISAM・・テーブルロック
InnoDB・・行ロック
InnoDBでも制約のないカラムに対して更新をかけるとテーブルロックになる

MySQL InnoDBの行レベルロック
共有ロック・・LOCK IN SHARE MODE
排他ロック・・FOR UPDATE
通常のSELECTでは一切ロックされないので、データの整合性を保持するためにSELECT時にロックをかける。

■ロックの流れ
START TRANSACTION(またはBEGIN)でトランザクションが開始される。

FOR UPDATEでSELECTするとそのレコードがロックされる。

(他のプロセスが該当レコードをFOR UPDATEでSELECTしてもロック待ちとなり取得できない。)

UPDATE/INSERT処理完了後、COMMIT(またはROLLBACK)するとロックが外れる。

(他のプロセスでロック待ちになっていた場合、処理が再開される)

※あくまで行ロックなので、同じテーブルでもレコードが違えば、ロック待ちとはならない。