select * from 表名 for update [of 表名.列名] [wait [待機時間]]|[nowait];
・of句
表を結合する場合に使用し、表とその列名を指定する
of句で指定した表のSELECTしたレコードがロックされるが、of句で指定していないレコードはロックされない
of句を指定しない場合、select対象の表のレコードはすべてロックされる
・wait句
対象レコードにロックがかかっていた時に、ロックが解放されるまで待機する
待機時間が指定してある場合、ロックが解放されるまで最大で指定した待機時間まで待つ
待機時間を超えた場合、「ORA-30006: リソース・ビジー; WAITタイムアウトの期限に達しました。」が発生する
wait句またはnowait句が指定されていない場合、ロックが解放されるまで待機する
デフォルトはwait(無期限)
・nowait句
対象レコードにロックがかかっていた時に、解放を待たずに「ORA-00054: リソース・ビジー、NOWAITが指定されていました。」が発生する
【例1】empとdeptはすべてロックする
SELECT時にロックがかかっていた場合、解放されるまで待機する
select e.emp_id, d.dept_id, e.name from emp e, dept d where e.dept_id = d.dept_id for update;
【例2】empのselectレコードのみロックし、deptのselectレコードはロックしない
SELECT時にロックがかかっていた場合、解放されるまで待機する
select e.emp_id, d.dept_id, e.name from emp e, dept d where e.dept_id = d.dept_id for update of e.emp_id;
【例3】emp、deptのselectレコードはすべてロックする
SELECT時にロックがかかっていた場合、解放されるまで最大60秒待機する
select e.emp_id, d.dept_id, e.name from emp e, dept d where e.dept_id = d.dept_id for update wait 60;
【例4】emp、deptのselectレコードはすべてロックする
SELECT時にロックがかかっていた場合、解放まで待機せず即座に復帰する
select e.emp_id, d.dept_id, e.name from emp e, dept d where e.dept_id = d.dept_id for update nowait;