SQLによる行ロックと表ロック
(行ロック)SELECT〜FOR UPDATE [WAIT | NOWAIT]
SELECT〜FOR UPDATEは行レベルでロックをするためのSQL文。
(10秒までは競合するトランザクションの完了を待つ) SELECT column FROM table WHERE column = 1 FOR UPDATE OF column WAIT 10;
- WAITとNOWAITについて
- WAIT -> 競合した場合にはロックが解除されるのを待機
- NOWAIT -> ロックが競合した場合に即エラーで制御を戻す
- INSERT/UPDATE/DELETEでNOWAITや待機時間を制限する指定はできない
- UPDATEやDELETEはSELECT〜FOR UPDATEを使用して該当する行をロック可能であるが、 INSERTの場合にはロックできない
(表ロック)LOCK TABLE
(排他モードで表ロックし、待ち状態にならない) LOCK TABLE table IN EXCLUSIVE MODE NOWAIT;