Oracle:更新语句没有等待/没有失败

时间:2011-04-05 00:15:51

标签: oracle locking deadlock

我在多应用程序环境中有许多竞争更新语句。根据目前的设计,死锁频繁。

如有必要,可以跳过除一个更新外的所有更新,并在下一个时间间隔更新。

我可以将NOWAIT应用于更新语句吗?当无法获得锁定时,我可以让我的声明无声地失败吗?我可以指定尝试获取锁定的时间长度吗?

2 个答案:

答案 0 :(得分:9)

不能在update语句中指定NOWAIT - 必须在SELECT FOR UPDATE语句中指定NOWAIT。

是的,您可以静默地使select更新失败 - 如果您指定NOWAIT并处理生成的异常:

BEGIN
  SELECT x FROM table FOR UPDATE NOWAIT;
EXCEPTION
  WHEN OTHERS THEN
    <handle exception>
END;

是的,可以指定一段时间等待。在上例中代替NOWAIT,指定WAIT n ,其中 n 是等待锁定的秒数。如果你在那段时间内无法获得锁定,它将再次使用ORA-00054失败,你可以像以前一样处理它。

答案 1 :(得分:2)

永远不要默默地抓住“他人”。在这种情况下,您应该捕获“resource_busy异常ORA-00054”。

declare
    resource_busy         exception;
    pragma exception_init(resource_busy,-54);
begin
    select x into z from table for update nowait;
exception
    when resource_busy
    then
        --Do something
end;