我在多应用程序环境中有许多竞争更新语句。根据目前的设计,死锁频繁。
如有必要,可以跳过除一个更新外的所有更新,并在下一个时间间隔更新。
我可以将NOWAIT应用于更新语句吗?当无法获得锁定时,我可以让我的声明无声地失败吗?我可以指定尝试获取锁定的时间长度吗?
答案 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;