for updateとfor update of


「FOR UPDATE OF」は「行ロック」(locks on the row)--フィールドロックは存在しません!
この「行ロック」の役割
1.CURSORのOPENから始まり、
2.ついに完全な転送--CURSORの終了(CLOSE your_cursor_name)ではなく、COMMITまたはROLLBACK.
3>.同じ「行」(row)の任意のフィールド(column)を変更するCURSORが2つある場合は、
時間的に次のCURSORは、最初の転送が完了するまで、COMMITまたはROLLBACKが待機します.
4.有効に処理されなければ、デッドロックが成形される.
たとえば、次のプログラムを2つのセッションで実行すると、2番目のセッションが待機します.のに至る
最初のセッションがCOMMITまたはROLLBACKを実行するまで.
declare
   -- query emp.name
   cursor cur_emp
       is 
   select empno, ename, job
     from emp
    where empno = 7369
      for update of ename;
begin
   for return_cur in cur_emp 
   loop   
      update emp
         set ename = 'LHG'
       where current of cur_emp;
   end loop;
end;

5.防止4の方法の1つは、FOR UPDATEの後にNOWAITを追加することである.このように、2番目のセッションは1つではありません.
待ち続けるのではなく、ORA-00054[resource busy and acquire with NOWAIT specified]のメッセージが表示されます.
そこで、私自身のFOR UPDATEの習慣は、
a.NOWAITはFOR UPDATEの後になるに違いない.
b.COMMITはプログラムの最後に存在しなければならない.デッドロック成形を防ぐ.
c.EXCEPTIONのROLLBACKは最も基本的なニーズです.
多くの場合、抽出サイクルで完了した処理はカーソルによって検出されたローを修正し、PL/SQLはこのような処理を行う構文を提供します.この構文は、カーソル宣言部のFOR UPDATE句と、UPDATE文またはDELETE文のWHERE CURRENT OF句の2つの部分を含む.通常、SELECT操作は、処理中のローに対してロック設定を実行しません.これにより、データベースに接続された他のセッションが選択中のデータを変更できます.アクティブセットが決定されると、OPENが実行されると、ORACLEはテーブルのスナップショットを切り取ります.この時点以前にコミットされた変更操作は、アクティビティセットに反映されます.この時点以降に行われる変更は、カーソルを再開しない限り、コミットされても反映されません(データが一致しない可能性があります).
ただし、FOR UPDATE句を使用すると、OPENが戻る前のアクティブセットの対応する行に反発ロックが付加され、これらのロックは他のセッションがアクティブセットの行を変更することを回避します.文のトランザクションがcommit文またはrollback文で終了するまで.
for update ofとfor updateの違い
1 select*from TTable 1 for updateロックテーブルのすべての行は、読み書きのみ可能
 
2 select*from TTable 1 where pkid=1 for update pkid=1の行のみロック
3 select*from Table 1 a join Table 2 b on a.pkid=b.pkid for update 2つのテーブルのすべてのレコードをロック
 
4 select*from Table 1 a join Table 2 b on a.pkid=b.pkid where a.pkid=10 for update 2つのテーブルの条件を満たす行をロック
5.select*from Table 1 a join Table 2 b on a.pkid=b.pkid where a.pkid=10 for update of a.pkid Table 1で条件を満たす行のみロック
 
まとめ:for updateとは、すべてのテーブルをロックするfor update of of後のテーブルの条件に従って対応するテーブルをロックすることです
nowaitについて(必ずFOR UPDATEを使うならnowaitを付けることをお勧めします)
LOCK競合がある場合、エラーが提示され、そこで待つのではなくstatementが終了する(例えば、調べるローが他のトランザクションにロックされ、現在のロックトランザクションが競合し、nowaitを加えると、現在のトランザクションが終了するとエラーが提示され、すぐにstatementが終了するまで待機する).
where current ofについて
FOR UPDATE句を使用すると、カーソル検索時に検索された行がロックされ、データベース内の物理行に対応します.この文の後半はコアです.本物のUPDATEの場合は、UPDATE句を示す後にwhere current ofを使用する.正確にはfor updateはupdateの検索準備をしています.
SelectFor Updateで参照されているレコードを削除または更新する場合は、Where Current Of文を使用します.
Where Current Of文を使用すると、最後にcursorによって取得されたレコードを更新または削除できます.