關於for update的幾個誤解(一)
阿新 • • 發佈:2019-01-28
初學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修改資料才是更危險的行為。