关于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修改数据才是更危险的行为。