У меня есть работа, работающая в производстве, которая случайно встречается с ошибкой ORA 54. Когда я проверил код, я мог видеть, что наличие NOWAIT
вызывает проблему. Теперь я решил проверить его и написал анонимный блок следующим образом.ORA 54 resouce busy error
declare
cursor c1 is
select * from table where column_1=2 and column_2=2 and column_3=6
for update of column_4 nowait;
record_locked exception;
pragma exception_init (record_locked, -54);
begin
begin
open c1;
exception
when record_locked then
dbms_output.put_line('Faced a locked record. Waiting for 2 minutes..');
dbms_lock.sleep(120);
open c1;
end;
exception
when others then
dbms_output.put_line('Exception Occured '||SQLCODE||SQLERRM);
end;
Я открыл одну сессию и побежал ниже запрос
select * from table
where column_1=2 and column_2=2 and column_3=6
for update of column_4 nowait;
Я не совершал или откат и сохранили сессию открытой. Теперь я запустил анонимный блок в другом сеансе. После ожидания в течение 2 минут он не прошел с ошибкой ORA 54. Поэтому мое предположение верно, я верю.
Теперь дело в том, что я выполнил весь код задания, содержащий первый анонимный блок в тестовой среде, таким же образом, он долго ждал блокированных записей, не опасаясь. Когда я выпустил блокировку, откатив ее, она обновила записи и успешно завершила работу.
Я хочу знать почему?
Странно. Но у меня есть вопрос: почему вы кодируете свой собственный период ожидания, когда 'select ... for update wait 120' будет иметь тот же эффект без дополнительного кода? –
Colin: Я хочу показать в журналах, что работа столкнулась с заблокированной записью, а затем она ждала 2 минуты, а затем отменяла .... Но даже исходный код работает по-разному в производстве и тестировании. :( – prabhath