1. 程式人生 > >關於for update的幾個誤解(一)

關於for update的幾個誤解(一)

初學sql開發的同學經常會在plsql developer中使用for update來修改表中記錄,

然後被經驗豐富一點的老鳥教導這個方法不如rowid修改好,於是摒棄了for update的語法。

事實上,對於for update我們可能存在不少誤解。

誤解1.for update是表級鎖


SESSION1對錶T_HOLIDAY的一行SELECT .... for update,可以看到在表級別是3號行獨佔鎖;此時在SESSION2對該行進行UPDATE、DELETE操作會被BLOCK


而在SESSION3種對另外的行做UPDATE、DELETE操作並無影響


因此,FOR UPDATE操作對錶是加行獨佔鎖,隻影響SELECT選中的行。

誤解2.用SELECT ROWID...比SELECT... FOR UPDATE更安全

下圖SESSION133正試圖對錶中1條記錄進行修改;


此時在表或記錄上並沒有任何鎖,另一個使用者在SESSION68對該記錄的FLAG和REMARK兩個欄位做了修改,並commit成功。


接著SESSION133使用者也對該記錄做了修改,修改完成後,他發現REMARK的值變成自己修改的新值,而FLAG卻莫名其妙也變了。他不知道的是SESSION68的使用者對REMARK欄位的修改完全被他略過了。


因此,在多使用者操作的環境裡,用ROWID修改資料才是更危險的行為。