如果有需要將SELECT
的資料先lock後再對資料做後續邏輯處理時,會使用到SELECT FOR UPDATE
來鎖定資料列。例如Stored Procedure中常會使用CURSOR來暫存SELECT的資料並做其他處理的情況。
Oracle不會對SELECT
查詢加鎖,而SELECT FOR UPDATE
就是將SELECT
查詢加上鎖來避免資料同時被其他交易修改,直到下一次的commit或rollback才會將鎖釋放,此機制稱為悲觀鎖。
例如原本有一列資料正由另一交易修改中,此時如執行SELECT FOR UPDATE
,則必須等待另一個交易commit或rollback後才會進行查詢。同樣地SELECT FOR UPDATE
的查詢未結束前,當另一交易要修改同一列的資料,也必須等待SELECT FOR UPDATE
執行結束才會能修改。。
例如下面使用SELECT FOR UPDATE
將取得的CURSOR加上鎖定,在執行結束前無法被其他交易修改。
DECLARE
l_row tb_employee%ROWTYPE;
CURSOR c1 IS
SELECT * FROM tb_employee
WHERE employee_id='A00001'
FOR UPDATE;
BEGIN
OPEN c1;
LOOP
FETCH c1 INTO l_row;
-- some code...
END LOOP;
CLOSE c1;
END;
沒有留言:
張貼留言