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開始。
留言
張貼留言