在oracle 11g中,允许设置会话和系统参数,称为ddl_lock_timeout
。当您需要执行某些语句并且资源被高度使用时(这是为了避免ORA-00054 exception),它非常有用。
但情况是10g中没有这样的参数。
当然,我可以使用这样的结构:
DECLARE START_DATE DATE := SYSDATE;
BEGIN
LOOP
IF SYSDATE>START_DATE+30/60/60/24 THEN
EXIT;
END IF;
BEGIN
<some statement>
EXIT;
EXCEPTION WHEN OTHERS THEN
IF sqlcode != -54 THEN
RAISE;
END IF;
END;
END LOOP;
END;
通过使用它,我将尝试在一个循环中执行该语句30秒,但这里的事情是该语句被执行了很多次并且可能导致一些麻烦(我不确定,但我觉得它不知何故),但使用ddl_lock_timeout
语句只执行一次,然后等待更加蓬松的资源。
有什么想法吗?
答案 0 :(得分:2)
这是对LOCK TABLE不一定有效的原因的解释。
LOCK TABLE - trick may not be working in all situations.
Session 1: Session 2:
create table table1(a number);
insert into table1 values(1);
commit;
update table1 set a = 2;
lock table table1 in exclusive mode;
<waits...>
commit;
"Table(s) Locked."
update table1 set a = 3; <-- notice session 1 goes in queue now.
DDL fails with "resource busy with NOWAIT".
Reason is DDL first commit the previous transaction
before executing the DDL. And when it commits
session 1 gets the lock as it was already in queue.