ORA 54资源繁忙错误

时间:2013-04-08 07:50:24

标签: oracle oracle10g

我有一个在生产中运行的工作随机出现错误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错误失败。所以我相信我的假设是正确的。

现在的问题是,当我以相同的方式在测试环境中运行包含第一个匿名块的整个作业代码时,它等待很长时间没有异常终止的锁定记录。当我通过回滚释放锁时,它更新了记录并成功完成。

我想知道为什么?

1 个答案:

答案 0 :(得分:1)

您的测试和制作会得到不同的结果,因为您的表格内容不同。您的测试表不包含与where子句匹配的任何行,因此您的会话不会相互阻塞。

尝试在测试表中添加至少一行符合条件的行,您应该获得与生产中相同的结果。