2013-04-08 1 views
1

У меня есть работа, работающая в производстве, которая случайно встречается с ошибкой 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. Поэтому мое предположение верно, я верю.

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

Я хочу знать почему?

+0

Странно. Но у меня есть вопрос: почему вы кодируете свой собственный период ожидания, когда 'select ... for update wait 120' будет иметь тот же эффект без дополнительного кода? –

+0

Colin: Я хочу показать в журналах, что работа столкнулась с заблокированной записью, а затем она ждала 2 минуты, а затем отменяла .... Но даже исходный код работает по-разному в производстве и тестировании. :( – prabhath

ответ

1

Вы получаете разные результаты испытаний и производства, потому что содержимое вашего стола отличается. Ваша тестовая таблица не содержит строк, которые соответствуют предложению where, поэтому ваши сеансы не блокируют друг друга.

Попробуйте добавить по крайней мере одну строку в тестовую таблицу, которая соответствует критерию, и вы должны получить те же результаты, что и в производстве.

+0

Hi Фрэнк: Спасибо за ответ. Фактически в моей тестовой таблице я создал 20 записей, которые соответствуют предложению where и которые являются одинаковыми в производстве. Еще одно сомнение. Являются ли сеансы блокировкой друг друга, чтобы исключить или конкретную сессию of nowait, чтобы получить блокировку, достаточно для ошибки ORA 54. – prabhath

+0

@prabhath Я не совсем понимаю вторую часть вашего комментария - вы спрашиваете, следует ли ожидать, что ORA-00054 ожидается в вашем сценарии? На мой взгляд, да. Кроме того, действительно ли вы на 100% уверены, что среда тестирования и производства точно идентична? (Уровень изоляции транзакций и т. Д.) –

+0

Я не уверен в уровне изоляции транзакций. Мое сомнение похоже на то, почему sa У меня код, работающий в двух разных средах, отличается поведением. Код, содержащий NOWAIT, бросает исключение в производство. Но когда я заблокировал несколько записей, которые удовлетворяют условию в тестовой среде и выполняли задание, вместо того, чтобы бросать ora 54 error, он ждал, пока я освобожу блокировки и обновил запись. Я подтвердил то же самое, что и журналы, а также обновленные записи, а также последний обновленный пользователь записей. – prabhath