2011-04-05 58 views
3

在多应用程序环境中,我有许多竞争更新语句。在目前的设计中,死锁频繁发生。Oracle:在更新语句中没有等待/没有失败

除了其中一个更新以外,可以根据需要跳过,并在下一个时间间隔更新。

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

回答

8

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

是的,你可以静静地失败一个选择的更新 - 如果指定NOWAIT和处理所产生的异常:

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

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

0

永不隐瞒“别人”。在这种情况下,您应该捕获“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;