在这种情况下,我们需要在游标中使用update nowait.
使用for update nowait将导致行占用并获取锁定,直到执行提交或回滚.
尝试获取锁定的任何其他会话都将收到ORA-00054的Oracle错误消息:资源占用,并通过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指定或超时到期,而不是等待释放锁.