網頁

2018/8/14

Oracle SELECT FOR UPDATE

如果有需要將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;

沒有留言:

張貼留言