小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


【Oracle】テーブル全体をロックして並行プロセスのinsertをブロックする

はじめに

Oracleでレコードをロックするには、SELECT FOR UPDATEを使います。
select * from table for updateとすれば、テーブル全体をロックされて新規レコードの挿入もブロックできるかと思っていましたが、新規レコードの挿入はブロックできないようです。

INSERT/UPDATE/DELETEでNOWAITや待機時間を制限する指定はできない
UPDATEやDELETEはSELECT~FOR UPDATEを使用して該当する行をロック可能であるが、 INSERTの場合にはロックできない
SQLによる行ロックと表ロック - jitsu102の日記 はてなブックマーク - SQLによる行ロックと表ロック - jitsu102の日記

テーブル全体をロックする

テーブル全体をロックするには、以下のクエリを使います。

LOCK TABLE table01 IN EXCLUSIVE MODE NOWAIT;

これで別プロセスによる新規レコードの挿入もブロックすることができます。