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が 行は最初のセッションでロックされないため、自由に更新できます。