加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

Oracle中for update和for update nowait的区别

发布时间:2021-01-12 08:54:57 所属栏目:站长百科 来源:网络整理
导读:1、 for update?和 ?for update nowait?的区别: 首先一点,如果只是 select?的话, Oracle是不会加任何锁的,也就是 Oracle对 ?select?读到的数据不会有任何限制,虽然这时候有可能另外一个进程正在修改表中的数据,并且修改的结果可能影响到你目前 select

通过这段代码案例,我们可以得到结论:for update of columns?用在多表连接锁定时,可以指定要锁定的是哪几张表,而如果表中的列没有在for update of?后面出现的话,就意味着这张表其实并没有被锁定,其他用户是可以对这些表的数据进行update操作的。这种情况经常会出现在用户对带有连接查询的视图进行操作场景下。用户只锁定相关表的数据,其他用户仍然可以对视图中其他原始表的数据来进行操作。?

??
Oracle的for update行锁?
语法如下:?
SELECT... FOR UPDATE [OF column_list][WAIT n|NOWAIT][SKIP LOCKED];?
其中:?
OF?子句用于指定即将更新的列,即锁定行上的特定列。?
WAIT?子句指定等待其他用户释放锁的秒数,防止无限期的等待。?
“使用FOR UPDATE WAIT”子句的优点如下:?
1防止无限期地等待被锁定的行;?
2允许应用程序中对锁的等待时间进行更多的控制。?
3对于交互式应用程序非常有用,因为这些用户不能等待不确定?
4 若使用了skip locked,则可以越过锁定的行,不会报告由wait n?引发的‘资源忙’异常报告

示例:?
create table t(a varchar2(20),b varchar2(20));?
insert into t values(‘1‘,‘1‘);?
insert into t values(‘2‘,‘2‘);?
insert into t values(‘3‘,‘3‘);?
insert into t values(‘4‘,‘4‘);?
现在执行如下操作:?
在plsql develope中打开两个sql窗口,?
在1窗口中运行sql:select * from t where a=‘1‘ for update;?
在2窗口中运行sql:
1. select * from t where a=‘1‘;?这一点问题也没有,因为行级锁不会影响纯粹的select语句?
2. select * from t where a=‘1‘ for update;?则这一句sql在执行时,永远处于等待状态,除非窗口1中sql被提交或回滚。?
如何才能让sql2不等待或等待指定的时间呢? 我们运行下面sql?
3. select * from t where a=‘1‘ for update nowait;?则在执行此sql时,直接报资源忙的异常。?
若执行?select * from t where a=‘1‘ for update wait 6;?则在等待6秒后,报资源忙的异常。
4. select * from t where a=‘1‘ for update nowait skip Locked;?则执行sql时,既不等待,也不报资源忙异常。?

select...for update of,这个of子句在牵连到多个表时,具有较大作用,如不使用of指定锁定的表的列,则所有表的相关行均被锁定;若在of中指定了需修改的列,则只有与这些列相关的表的行才会被锁定。

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读