暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle ORA-00054: 资源占用和使用NOWAIT或timeout指定的请求已过期

ASKTOM 2020-09-08
724

问题描述

你好,

我们在包-> 过程-> 中有光标,如下所示,

在声明部分-

cursor cur1 is
      select *
        from abc
       where load = v_load              --- load and v_load are number;
       for update of cust_no nowait;
复制


在开始部分-

    tabelle := stl.gtext('xyz', 'pr12345.cxx', 1); ---- 'cur1:open'
    open cur1 ;
    loop
    tabelle := stl.gtext('xyz', 'pr12345.cxx', 2); -- 'cur1:fetch'
      fetch cur1 into newrec;
      exit when cur1%notfound;
复制


在过去的几个月里,我们在日志文件中收到错误-

xxxxxx中的Fehler (包)。xxxxxxx (过程) cur1: 打开ORA-00054: 重新存储源

这是德语,它翻译-

xxxxxx中的Fehler (包).xxxxxxx (过程) cur1: 打开ORA-00054: 资源占用和使用NOWAIT或timeout指定的请求已过期

您能否就如何处理此错误或避免需要做的事情提供帮助。

专家解答

这意味着另一个会话锁定了查询访问的行。

你可以通过运行看到这一点:

create table t (
  c1 int primary key, c2 int
);

insert into t values ( 1, 1 );
commit;

update t
set    c2 = 9999
where  c1 = 1;
复制


然后在另一个会话中尝试:

select * from t
where  c1 = 1
for update nowait;

ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
复制


您将在第二个会话中不断收到此错误,直到第一个事务提交或回滚。

你如何确切地解决这个问题取决于你处理许多人同时更改相同数据的逻辑。

选项包括:

-告诉最终用户 “其他人正在更改这些数据,请稍后再试”
-删除nowait,因此第二个会话等待 (可能很长时间) 第一个事务完成。请注意,这可能会导致更新丢失。
-更改为更新等待N; 其中N是等待第一个会话结束的秒数
-重组应用程序,因此并发更改的可能性较小

这些都有各种各样的利弊,所以第一步是弄清楚为什么两个会话试图同时改变相同的行。这将有助于告知您该怎么做的选择。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论