Oracle ロック 手順

Oracle において ロック に関して示す。

行ロック(コミット読取りトランザクション)

  ■SESSION1  update dapt set LOC=HADA' where deptno=77;
  □SESSION2  update dapt set LOC=HADA' where deptno=77;
              待ち発生
  ■SESSION1  commit;
  □SESSION2  制御が戻る

行ロック(シリアライズ可能トランザクション)

  ■SESSION1  update dapt set LOC=HADA' where deptno=77;
  □SESSION2  update dapt set LOC=HADA' where deptno=77;
              待ち発生
  ■SESSION1  commit;
  □SESSION2  制御が戻るがエラー発生
              ORA-08177: can't serialize access for this transaction

SELECT FOR UPDATE

  ■SESSION1  select * from dept for update;
  □SESSION2  insert文
              成功
  □SESSION2  update文
              待ち発生
  ■SESSION1  commit;
  □SESSION2  制御が戻る

※マルチバージョン制御

  "REPEATABLE READ"分離レベル相当の動作をする。
  ○ 新規行の挿入(ファントム読み取り)
  × 既存行の更新、削除(反復読み取り)
  ロックの範囲としては"更新行"にロックをかける。
  ゆえにWHERE句が異なれば互いに更新をかけることは可能。

  ① 問い合わせが実行段階に入ると現行のSCNが決定される。
  ② 変更されたデータを含むブロックは、それらをロールバックセグメント
     内のデータに基づいて再構成され、問い合わせにはその再構成された
     データが戻される。
  ③ ゆえに、問い合わせの実行中に発生する他のトランザクションの変更は
     参照されない。

※RAC環境

  読取り一貫性のあるブロックイメージをインスタンス間で転送する際に、
  キャッシュフュージョンいう転送メカニズムを使う。

※NOWAIT

  NOWAITオプションを付与すると、待ちを発生させずにエラーを即座に返す。

ご訪問頂き有難う御座います。 当サイトを効率良く使うためにまずは FrontPage を見て下さい。 検索方法、一覧表示などの各情報を纏めています。
当サイトの説明 → Frontpage