|
スポンサード リンク
SELECTした行をロックするには、FOR UPDATE句を使用します。
FOR UPDATE
[ OF 表.列名 ]
[ WAIT [ 待機時間 ] | NOWAIT ]
|
OF句
表を結合する場合に使用し、表とその列名を指定します。
OF句で指定した表のSELECTしたレコードがロックされますが、OF句で指定してない表はロックされません。
OF句で指定する列名は対象表の列ならなんでも良いです。
OF句を指定しない場合は、SELECT対象の表のレコードは全てロックされます。
WAIT句
対象レコードにロックがかかっていた時に、ロックが開放されるまで待機します。
待機時間が指定してある場合は、ロックが開放されるまで最大で、指定した待機時間まで待機します。待機時間を超えた場合は、下記エラーで復帰します。(9i以降)
「ORA-30006: リソース・ビジー; WAITタイムアウトの期限に達しました。」
WAIT句またはNOWAIT句の両方していしてない場合は、ロックが開放されるまで待機します。
NOWAIT句
対象レコードにロックがかかっていた時に、開放を待たずに下記エラーで復帰します。
「ORA-00054: リソース・ビジー、NOWAITが指定されていました。」
※制限事項
DISTINCT演算子またはCURSOR式、集合演算子(UNION / INTERSECT / MINUS)、GROUP BYまたは集計関数とともに指定することはできません。
|
例1) 表「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;
|
例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時にロックがかかっていた場合は、ロックが開放されるまで最大30秒待機する。
|
select e.emp_id,d.dept_id,e.name
from emp e,dept d
where e.dept_id = d.dept_id
for update wait 30;
|
例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;
|
スポンサード リンク
|