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;

DDL実行時のロック

Oracleでは基本的に、DDLはNOWAIT、DMLはWAITで動作する。
Oracle11gからは、DDL_LOCK_TIMEOUTパラメータでDDLにおける待機時間を設定できる。

(セッションレベルで、DDLのタイムアウトを60秒に設定)
ALTER SESSION SET DDL_LOCK_TIMEOUT = 60;


http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05749-01/title.htm