Oracle: нет ожидания / нет ошибки при обновлении - PullRequest
4 голосов
/ 05 апреля 2011

У меня много конкурирующих операторов обновления в среде с несколькими приложениями. При нынешнем дизайне часто возникают тупики.

Все обновления, кроме одного, могут быть пропущены при необходимости и обновлены в следующий интервал.

Могу ли я применить NOWAIT к обновлению? Могу ли я заставить мое заявление молча провалиться, когда оно не может получить блокировку? Могу ли я указать, сколько времени он пытается получить блокировку?

Ответы [ 2 ]

9 голосов
/ 05 апреля 2011

Нет, вы не можете указать NOWAIT в операторе обновления - NOWAIT должен быть указан в операторе SELECT FOR UPDATE.

Да, вы можете молча отменить выбор для обновления - если вы укажете NOWAIT и обработаете исключениесгенерировано:

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

Да, можно указать время ожидания.Вместо NOWAIT в приведенном выше примере укажите WAIT n , где n - количество секунд ожидания блокировки.Если вы не можете получить блокировку в это время, она снова выйдет из строя с ORA-00054, с которым вы можете справиться, как и раньше.

2 голосов
/ 29 сентября 2017

Никогда не молча лови "других". В этом случае вы должны перехватить исключение 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;
...