photo credit: dzarro72 via photopin cc
はじめに
Oracleで行または表に対して他のプロセスからの参照/更新をブロックするには、select文の最後にfor updateを指定します。
以下の例ではtable01テーブルに対してテーブルロックがかかります。
select * from table01 for update;
ロックがかかっている行および表を参照する際、ロックタイムアウト時間を明示的に指定しない場合、ロックを取得したトランザクションが終了するまで永遠に待ち続けます。
ロックタイムアウト時間を明示的に指定する
別プロセスがロックを取得していた場合に、エラーを返せるようロックタイムアウト時間を設定するには、wait ロック待ち時間(sec)を指定します。
以下の例では、table01テーブルに対してテーブルロックがかかります。他のトランザクションがすでにロックを取得していた場合は、10秒だけ待ってタイムアウトします。
select * from table01 for update wait 10;
ロックタイムアウトに達した場合のエラー
ロックタイムアウトが発生した場合は、以下のエラーとなります。
ORA-30006: リソース・ビジー; WAITタイムアウトの期限に達しました。