ORACLE中更新資料,PLSQL Developer中SELECT ... FOR UPDATE和 SELECT T.*,ROWID的區別
背景:ORACLE中更新少量資料時,在PLSQL Developer中,一般用的語句是SELECT FOR UPDATE和SELECT T.*,ROWID,這倆語句執行之後可以手動在查詢出來的資料中修改。
例項背景:表名A,資料如下:
COL1 | COL2 |
1 | a |
2 | b |
3 | c |
4 | d |
此時,我要更新表A中的資料。
語句1:SELECT A.COL2 FROM A WHERE A.COL1 IN (1,2,3) FOR UPDATE;
執行語句1.
語句2:UPDATE A SET COL2 = 'aa' WHERE COL1 = 1;
執行語句2 ,會發現此時語句2一直在執行狀態,無法完成。
語句3:UPDATE A SET COL2 = 'dd' WHERE COL1 = 4;
執行語句3,可以執行成功。
總結:使用FOR UPDATE時,會鎖住當前要update的資料,在for update這個事務執行完畢之前,是無法對鎖住的那部分資料進行更新的。語句3中的資料沒有for update,也就未處於鎖定狀態。可以進行更新。
SELECT A.*,ROWID FROM A;這個語句是不會鎖表的。rowid應該是指資料的實體地址,使用rowid之後,可以直接進行資料的更新。
TIPS:for update 語句只能用於單表更新。