我有一個工作正在運行,隨機地隨着ORA 54錯誤而異常終止。當我檢查代碼時,我可以看到NOWAIT
的存在導致了這個問題。現在我決定測試它,並寫下如下匿名塊。ORA 54資源忙碌錯誤
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錯誤。所以我相信我的假設是正確的。
現在的情況是,當我以相同的方式在測試環境中運行包含第一個匿名塊的整個作業代碼時,它無需等待就等待鎖定的記錄。當我通過回滾釋放鎖時,它更新了記錄併成功完成。
我想知道爲什麼?
奇怪。但是我有一個問題:當你選擇... for update wait 120'時,你爲什麼要編寫自己的等待期,而不需要額外的代碼呢? – 2013-04-08 08:54:03
Colin:我想在日誌中顯示工作面臨一個鎖定的記錄,然後等待2分鐘,然後abending ....但即使是原始代碼workng不同的方式在生產和測試.. :( – prabhath 2013-04-08 09:36:02