ORACLE FOR UPDATE与FOR UPDATE OF区别

本文转自:http://blog.sina.com.cn/s/blog_61cd89f60102e7di.html

在生产数据库中,我们为了保证数据读、写的唯一性,经常会碰到下面五种锁语句,区别在那?下面我们用实例说明一下:

1、FOR UPDATE

2、FOR UPDATE OF COLUMN

3、FOR UPDATE WAIT

4、FOR UPDATE NOTWAIT

5、FOR UPDATE NO WAIT SKIP LOCK

下面先来看看几个例子:

1、SELECT * FROM EMP FOR UPDATE ;  --锁定表的所有行,只能读不能写

1 declare
2     cursor emp_cur
3     is
4     select * from emp for update ; --锁定所有的行,只能读不能写
5 begin
6     for x in emp_cur loop
7         update emp set sal = 9999 where current of emp_cur ;
8     end loop ;
9 end ;

2、SELECT * FROM EMP WHERE DEPTNO = 10 FOR UPDATE ;    --只锁定DEPTNO = 10 的行

1 declare
2     cursor emp_cur
3     is
4     SELECT * FROM EMP WHERE DEPTNO = 10 FOR UPDATE ;    --只锁定DEPTNO = 10 的行
5 begin
6     for x in emp_cur loop
7         update emp set sal = 9999 where current of emp_cur ;
8     end loop ;
9 end ;

3、SELECT * FROM EMP E , DEPT D WHERE E.DEPTNO = D.DEPTNO FOR UPDATE     --锁定两个表的所有记录

4、SELECT * FROM EMP E , DEPT D WHERE E.DEPTNO = D.DEPTNO AND E.DEPTNO = 10 FOR UPDATE  ;   -- 锁定两个表中满足条件的行

5、SELECT * FROM EMP E , DEPT D WHERE E.DEPTNO = D.DEPTNO AND E.DEPTNO = 10 FOR UPDATE OF E.DEPTNO ;   --只会锁定EMP表中满足条件的行

可以看出来FOR UPDATE是把所有的表都锁定,而FOR UPDATE OF 是根据OF后面的条件锁定相应的表

第一点:

对于单表操作而言,FOR UPDATE 和 FOR UPDATE OF 是一样的不加条件是对全表的锁定,加了条件是对行级别的锁定。举个栗子:

1、不加WHERE条件是对全表进行锁定

SELECT * FROM EMP FOR UPDATE ;   --对全表进行锁定

2、加上WHERE条件是对行级别的锁定

SELECT * FROM EMP WHERE DEPTNO = 10 FOR UPDATE ;  --只对满足条件的10部门进行锁定

再次提醒FOR UPDATE 和 FOR UPDATE OF 对于单表操作是一样的。

那么FOR UPDATE 和 FOR UPDATE OF 的区别到底在哪呢?在进行多表查询时FOR UPDATE OF只锁定列所在的表进行锁定,而且是表级别的锁定,FOR UPDATE是对多个表进行锁定,不懂看例子:

1、SELECT * FROM EMP E ,DEPT D WHERE E.DEPTNO = D.DEPTNO AND E.DEPTNO = 10 FOR UPDATE OF E.DEPTNO ;

--只锁定E.DEPTNO所在的表并且只锁定DEPTNO = 10 的行

2、SELECT * FROM EMP E , DEPT D WHERE E.DEPTNO = D.DEPTNO AND E.DEPTNO = 10 FOR UPDATE ;

-- 锁定多个表

1 和 2 的区别在于 , 1只锁定表EMP 而 2 要锁定EMP表和DEPT表 ,这才是二者真正的区别。 即 FOR UPDATE 是把所有的表都锁上,而FOR UPDATE OF是根据相应的条件锁定相应的表 

第二点:关于NOWAIT(如果一定要使用FOR UPDATE,更建议使用NOWAIT)

1、当有LOCK冲突时会提示错误并结束STATEMENT而不是在那里等待(比如:要查的行已经被其它事务锁了,当前的锁事务与之冲突,加上nowait,当前的事务会结束会提示错误并立即结束 STATEMENT而不再等待).

2、WAIT 子句指定等待其他用户释放锁的秒数,防止无限期的等待。

“使用FOR UPDATE WAIT”子句的优点如下:
  1.防止无限期地等待被锁定的行;
  2.允许应用程序中对锁的等待时间进行更多的控制。
  3.对于交互式应用程序非常有用,因为这些用户不能等待不确定
  4.若使用了skip locked,则可以越过锁定的行,不会报告由wait n 引发的‘资源忙’异常报告

时间: 2024-10-29 00:19:54

ORACLE FOR UPDATE与FOR UPDATE OF区别的相关文章

oracle for update和for update nowait(for update wait)的区别

1.for update 和 for update nowait 的区别: 1.oracle 中执行select 操作读取数据不会有任何限制,当另外一个进程在修改表中的数据,但是并没有commit,所以select的结果为当前时刻表中的记录. 2.加入for update后会该表符合条件的数据进行加锁,注意的是这里只是锁定了符合条件的行,其他行还是可以被其他进程操作.其他进程若是想修改(update)当前行就会出现阻塞.就会一直等待到当前进程commit后才会被执行. 3.for update

oracle for update和for update nowait的区别

1.for update 和 for update nowait 的区别: 首先一点,如果只是select 的话,Oracle是不会加任何锁的,也就是Oracle对 select 读到的数据不会有任何限制,虽然这时候有可能另外一个进程正在修改表中的数据,并且修改的结果可能影响到你目前select语句的结果,但是因为没有锁,所以select结果为当前时刻表中记录的状态. 如果加入了for update, 则Oracle一旦发现(符合查询条件的)这批数据正在被修改,则不会发出该select语句查询,

Oracle 中for update和for update nowait的区别

http://www.cnblogs.com/quanweiru/archive/2012/11/09/2762223.html 1.for update 和 for update nowait 的区别: 首先一点,如果只是select 的话,Oracle是不会加任何锁的,也就是Oracle对 select 读到的数据不会有任何限制,虽然这时候有可能另外一个进程正在修改表中的数据,并且修改的结果可能影响到你目前select语句的结果,但是因为没有锁,所以select结果为当前时刻表中记录的状态.

Oracle 中 for update 和 for update nowait 的区别

原文出处http://bijian1013.iteye.com/blog/1895412 一.for update 和 for update nowait 的区别 首先一点,如果只是select 的话,Oracle是不会加任何锁的,也就是Oracle对 select 读到的数据不会有任何限制,虽然这时候有可能另外一个进程正在修改表中的数据,并且修改的结果可能影响到你目前select语句的结果,但是因为没有锁,所以select结果为当前时刻表中记录的状态. 如果加入了for update,则Ora

【JAVA】FOR UPDATE 和 FOR UPDATE NOWAIT 区别 (转)

1.for update 和 for update nowait 的区别:首先一点,如果只是select 的话,Oracle是不会加任何锁的,也就是Oracle对 select 读到的数据不会有任何限制,虽然这时候有可能另外一个进程正在修改表中的数据,并且修改的结果可能影响到你目前select语句的结果,但是因为没有锁,所以select结果为当前时刻表中记录的状态.如果加入了for update, 则Oracle一旦发现(符合查询条件的)这批数据正在被修改,则不会发出该select语句查询,直到

for update 和 for update nowait 的区别

首先一点,如果只是select 的话,Oracle是不会加任何锁的,也就是Oracle对 select 读到的数据不会有任何限制,虽然这时候有可能另外一个进程正在修改表中的数据,并且修改的结果可能影响到你目前select语句的结果,但是因为没有锁,所以select结果为当前时刻表中记录的状态.         如果加入了for update,则Oracle一旦发现(符合查询条件的)这批数据正在被修改,则不会发出该select语句查询,直到数据被修改结束(被commit),马上自动执行这个sele

oracle for update和for update nowait

原文地址:http://www.cnblogs.com/quanweiru/archive/2012/11/09/2762223.html 1.for update 和 for update nowait 的区别: 首先一点,如果只是select 的话,Oracle是不会加任何锁的,也就是Oracle对 select 读到的数据不会有任何限制,虽然这时候有可能另外一个进程正在修改表中的数据,并且修改的结果可能影响到你目前select语句的结果,但是因为没有锁,所以select结果为当前时刻表中记

oracle 中的for update 和for update nowait

1.for update 和 for update nowait 的区别: 首先一点,如果只是select 的话,Oracle是不会加任何锁的,也就是Oracle对 select 读到的数据不会有任何限制,虽然这时候有可能另外一个进程正在修改表中的数据,并且修改的结果可能影响到你目前select语句的结果,但是因为没有锁,所以select结果为当前时刻表中记录的状态. 如果加入了for update, 则Oracle一旦发现(符合查询条件的)这批数据正在被修改,则不会发出该select语句查询,

游标更新 for update 与for update of 字段的区别

尝试了一下,发现不同的地方在于出现表连接的时候ex: select a.col1 from a, b where a.col1 = b.col2 and ... for udpate 这个时候锁住了a,b两个表中满足条件的记录,而select a.col1 from a, b where a.col1 = b.col2 and ... for update of a.col1仅仅锁住了a表中满足条件的记录 所以for update 和for update of 还是有区别的 没有标关联的时候一样