当我使用FOR UPDATE OF SAL
或简单地编写FOR UPDATE
.
根据奥莱利
FOR UPDATE 子句的 OF 列表不限制您仅更改列出的那些列。锁仍然放置在所有行上;OF 列表只是为您提供了一种更清楚地记录您打算更改的内容的方法。如果您只是在查询中声明 FOR UPDATE 并且在 OF 关键字之后不包含一或多个列,那么数据库将锁定 FROM 子句中列出的所有表中所有已识别的行。
这意味着,当我用 指定列名时FOR UPDATE OF SAL
,其他用户只能用SAL
列进行更改。但是,实际上,情况并非如此。我仍然在其他会话中被锁定。谁能解释一下区别。
更新
----- SESSION 1
declare
emp_info emp.ename%type;
cursor emp_cur is select ename from emp join dept using(deptno) where deptno=&no for update of sal;
begin
open emp_cur;
loop
fetch emp_cur into emp_info;
exit when emp_cur%notfound;
dbms_output.put_line(emp_info);
end loop;
close emp_cur;
end;
----- SESSION 2
update emp set comm=5 where deptno=10;
---- hanged/waiting in session 2