2013-10-13 85 views
0

我是有點混亂有關更新鎖,在下面的程序甲骨文更新鎖

CREATE OR REPLACE 
PROCEDURE pro_cedure(
    p_dept_id NUMBER) 
IS 
    CURSOR mycursor 
    IS 
    SELECT deptno,comm,extra 
    FROM emp 
    WHERE comm IS NULL 
    AND extra IS NOT NULL 
    AND deptno = p_dept_id 
    FOR UPDATE OF comm; 
BEGIN 
    FOR emp_rec IN mycursor 
    LOOP 
    UPDATE emp SET comm = extra 
    WHERE CURRENT OF mycursor; 
    INSERT INTO changed 
     (
     deptno, 
     oldval, 
     newval, 
     seq_nextval 
    ) 
     VALUES 
     (
     emp_rec.deptno, 
     emp_rec.comm, 
     emp_rec.extra, 
     sequence_name.nextval 
    ); 
    END LOOP; 
END; 

如果其他用戶嘗試在我更新它會導致鎖更新同一個表或同一行這個節目?

+0

寫入數據(update,inserd,delete)的SQL命令會鎖定已修改的行。在提交或回滾被髮布之前,鎖保持活動。如果另一個會話(用戶)試圖修改鎖定的記錄,則會話將被掛起,並且必須等到鎖定被另一個會話刪除。 – krokodilko

+0

你不需要光標,你可以將整個過程簡化爲兩個簡單的語句。 –

+0

是的,但我需要插入到更改後的表中,作爲舊值和新值在單個過程中。 – user2686661

回答

0

如果您並行運行此過程2次,第二個將不會執行select直到第一次提交。 (當然,如果您運行其他語句來更新comm子句,它們將以相同的方式排隊。)

+0

如果在更新每個不同的p_dept_id輸入到上述過程時該行是唯一的,該怎麼辦?鎖仍然會起作用。 – user2686661

+0

只有選定的行將被鎖定。所以如果你用不同的p_dept_id調用這個過程,他們不會等待其他人,因爲它們鎖定了不同的行。 –

+0

謝謝你的回答。正在等待這個答案。 – user2686661