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

oracle – 什么时候应该在游标中使用’for update nowait’?

发布时间:2020-12-12 13:47:56 所属栏目:百科 来源:网络整理
导读:在这种情况下,我们需要在游标中使用update nowait. 使用for update nowait将导致行占用并获取锁定,直到执行提交或回滚. 尝试获取锁定的任何其他会话都将收到ORA-00054的Oracle错误消息:资源占用,并通过NOWAIT指定或超时获取,而不是等待释放锁定. SESSION1:
在这种情况下,我们需要在游标中使用update nowait. 使用for update nowait将导致行占用并获取锁定,直到执行提交或回滚.
尝试获取锁定的任何其他会话都将收到ORA-00054的Oracle错误消息:资源占用,并通过NOWAIT指定或超时获取,而不是等待释放锁定.

SESSION1:

CURSOR abc_cur 
IS 
select * from dept where deptno =10 for update nowait;

这里行被锁定,直到游标关闭或提交/回滚执行.如果同时第2个会话中的另一个用户尝试访问相同的记录,那么将会出现如下错误:

会议2:

select * from dept where deptno =10 for update nowait;

该用户甚至不能更新或删除第一个会话已锁定的相同记录.

ERROR at line 1:
`ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired`

用法:
现在,如果要对某些记录集进行某些操作,并且不希望另一个会话的另一个用户重写数据,则必须首先锁定记录(使用更新nowait),然后进行操作.完成操作后,关闭光标并提交.

编辑
假设在我的会话1中,我执行了以下脚本:

declare
cursor abc is select * from temp ;
temp abc%rowtype;
begin
open abc;
end;

现在在会议2我执行

select * from temp ;

0 rows found

如果我再次执行相同的脚本

declare
cursor abc is select * from temp ;
temp abc%rowtype;
begin
open abc;
end;

然后我得到ORA-00054:资源繁忙并且采用NOWAIT指定或超时到期,而不是等待释放锁.

(编辑:李大同)

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

    推荐文章
      热点阅读