Oracl e 之UPDATE 关键字NOWAIT的详解
update是什么1、FOR UPDATE 和FOR UPDATE NOWAIT 的区别:
首先一点,假设只是SELECT 的话,Oracle是不会加任何锁的,也就是Oracle对SELECT 读到的数据不会有任何限制,虽然这时候有可能另外一个进程正在修改表中的数据,并且修改的结果可能影响到你目前SELECT语句的结果,但是因为没有锁,所以SELECT 结果为当前时刻表中记录的状态。
假设参加了FOR UPDATE,那么Oracle一旦发现〔符合查询条件的〕这批数据正在被修改,那么不会发出该SELECT语句查询,直到数据被修改完毕〔被COMMIT〕,马上自动执行这个SELECT语句。
同样,假设该查询语句发出后,有人需要修改这批数据〔中的一条或几条〕,它也必须等到查询完毕后〔COMMIT〕后,才能修改。
FOR UPDATE NOWAIT和FOR UPDA TE 都会对所查询到得结果集进展加锁,所不同的是,假设另外一个线程正在修改结果集中的数据,FOR UPDATE NOW AIT 不会进展资源等待,只要发现结果集中有些数据被加锁,立即返回“ORA-00054错误,内容是资源正忙, 但指定以NOW AIT 方式获取资源〞。
FOR UPDATE 和FOR UPDATE NOWAIT 加上的是一个行级锁,也就是只有符合WHERE条件的数据被加锁。假设仅仅用UPDA TE语句来更改数据时,可能会因为加不上锁而没有响应地、莫名其妙地等待,
但假设在此之前,FOR UPDATE NOW AIT语句将要更改的数据试探性地加锁,就可以通过立即返回的错误提示而明白其中的道理,或许这就是FOR UPDATE和NOW AIT的意义之所在。
经过测试,以FOR UPDATE 或FOR UPDATE NOW AIT方式进展查询加锁,在SELECT 的结果集中,只要有任何一个记录在加锁,那么整个结果集都在等待系统资源〔假设是NOW AIT,那么抛出相应的异常〕
2、FOR UPDATE NOWAIT 与FOR UPDATE 的目的:
锁定表的所有行,排斥其他针对这个表的写操作。确保只有当前事务对指定表进展写
操作。
FOR UPDATE NOW AIT和FOR UPDATE的区别:
别的事务要对这个表进展写操作时,是等待一段时间还是马上就被数据库系统回绝而返回.制定采用NOWAIT方式来进展检索,所以当发现数据被别的session锁定中的时候,就会迅速返回ORA-00054错误,内容是资源正忙, 但指定以NOW AIT 方式获取资源。所以在程序中我们可以采用NOW AIT方式迅速判断当前数据是否被锁定中,假设锁定中的话,就要采取相应的业务措施进展处理。
如何理解上面的话.
开启一个会话(就是开一个sqlwindow)
SELECT empno,ename FROM emp FOR UPDATE NOWAIT WHERE empno='7369';
得到下面结果集:
empno ename
7369 smith
开启另一个会话
SELECT empno,ename FROM emp FOR UPDATE NOWAIT WHERE empno="7369"
返回RA-00054错误,内容是资源正忙, 但指定以NOW AIT 方式获取资源上面会话都提交COMMIT;
开启一个会话,
SELECT empno,ename FROM emp FOR UPDATE WHERE empno='7369';
得到下面结果集
empno ename
7369 smith
开启另一个会话
SELECT empno,ename FROM emp FOR UPDATE WHERE empno="7369"
阻塞,不返回错误。提交第一个会话,第二个会话自动执行提交第二个会话。
FOR UPDATE: 当第一个session最后COMMIT或者ROLLBACK之后,第二个session 中的检索结果就是自动跳出来,并且也把数据锁定住.
开启一个会话:
SELECT empno,ename FROM emp FOR UPDA TE WHERE empno="7369";
得到下面结果集:
empno ename
7369 smith
开启另一个会话,
UPDATE emp set ename='ALLEN' WHERE empno="7396";
阻塞。提交第一个会话,UPDATE 语句执行。
再开启一个会话
UPDATE emp set ename="SMITH" WHERE empno='7396';
同样阻塞,虽然第一个会话因为提交而释放了锁,但是第二个会话中的UPDATE 又给这一行加锁了;
FOR UPDATE NOW AIT:当你第一个session放开锁定以后,第二个session才能正常运行。当你第二个session语句运行后,数据又被你第二个session语句锁定住了,这个时候只要你第二个session语句后还没有COMMIT,别的session照样不能对数据进展锁定更新等等。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论