Oracleドキュメント から :
クエリが単一のテーブルを参照している場合、FOR UPDATE
の間に違いはありません。 およびFOR UPDATE OF ...
、ただし、後者は、更新する列を示す自己文書化として引き続き役立つ場合があります。ただし、更新できるものを制限するものではありません。持っている場合:
CURSOR cur IS SELECT * FROM emp FOR UPDATE OF sal;
その後も次のことができます:
UPDATE emp SET comm = comm * 1.1 WHERE CURRENT OF cur;
ただし、複数のテーブルがある場合は、FOR UPDATE OF ...
OF
で指定した列を含むテーブルの行のみをロックします 条項。
あなたが質問で言っていると私が思うことに反して。 FOR UPDATE OF sal
を指定する sal
をロックするだけではありません 桁;単一の列をロックすることはできません。最小のロックは行レベルです。 (ロックの詳細
)。 SAL
を含むテーブルのすべての行をロックします クエリによって選択された列。
質問の更新では、カーソルクエリがemp
に参加しています およびdept
、ただしOF
句にはsal
のみがあります 、emp
の列 テーブル。 emp
の行 カーソルを開くとテーブルがロックされ、commit
するまでこれらのロックは解除されません。 またはrollback
そのセッション。カーソルループ内で次のことができます。
UPDATE emp SET ... WHERE CURRENT OF emp_cur;
... emp
の行を更新します ループのこの反復に関連するテーブル。 できません 行う:
UPDATE dept SET ... WHERE CURRENT OF emp_cur;
... dept
の行が OF
に列がなかったため、テーブルはロックされていません 。これは、2番目のセッションでdept
が 行は最初のセッションでロックされないため、自由に更新できます。