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

前端之家收集整理的这篇文章主要介绍了oracle – 什么时候应该在游标中使用’for update nowait’?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在这种情况下,我们需要在游标中使用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指定或超时到期,而不是等待释放锁.

猜你在找的Oracle相关文章