我有一个在生产中运行的工作随机出现错误ORA 54.当我检查代码时,我可以看到NOWAIT
的存在导致问题。现在我决定测试它并编写一个匿名块,如下所示。
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 :(得分:1)
您的测试和制作会得到不同的结果,因为您的表格内容不同。您的测试表不包含与where子句匹配的任何行,因此您的会话不会相互阻塞。
尝试在测试表中添加至少一行符合条件的行,您应该获得与生产中相同的结果。