Oracle Select For Update NOWAIT用法


如果有需要將Select的資料進行Lock後, 再將資料做後續邏輯處理時, 會使用到Select For Update來鎖定資料列。

但如果要鎖定的資料列已被其他session鎖定時, 則會發生一直等待的狀況, 直到其他session釋放資料的鎖定狀態。

但有時我們可能會希望不要等待, 直接回傳資料已被鎖定的錯誤時, 則可以在FOR UPDATE後面再加上NOWAIT指令來達到該效果。

[Session1]
UPDATE ABC SET C2='111' WHERE C1='AAA';    --鎖定資料

[Session2]
DECLARE
  l_row       ABC%ROWTYPE;
  CURSOR cr1 IS SELECT * FROM ABC WHERE C1='AAA' FOR UPDATE; 
BEGIN
  OPEN cr1;
  LOOP
    FETCH cr1 INTO l_row;
  END LOOP;
  CLOSE cr1;
END;

[Session3]
DECLARE
  l_row       ABC%ROWTYPE;
  CURSOR cr1 IS SELECT * FROM ABC WHERE C1='AAA' FOR UPDATE NOWAIT;
BEGIN
  BEGIN
    OPEN cr1;
    LOOP
      FETCH cr1 INTO l_row;
    END LOOP;
    CLOSE cr1;
  EXCEPTION
    WHEN OTHERS THEN
      DBMS_OUTPUT.put_line(SQLERRM);
  END;
END;

此時[Session2]會一直處於等待狀態, 但[Session3]則會直接發生Exception。

PS. 在Open Cursor時就會發生LOCK的狀態, 所以在包Begin Exception End時要從Open Cursor開始。

留言

這個網誌中的熱門文章

ORA-12514: TNS: 監聽器目前不知道連線描述區中要求的服務

Oracle 例外控制(Exception Control)

Oracle 工作排程 DBMS_JOB 筆記