發表文章

目前顯示的是有「Lock Row」標籤的文章

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開始。