'的替代方案;ddl_锁定超时';在oracle 10g中
在Oracle11g中,允许设置会话和系统参数,称为。当您需要执行某些语句并且资源被高度使用(为了避免)时,它非常有用 但情况是10g中没有这样的参数 当然,我可以使用这样的共建:'的替代方案;ddl_锁定超时';在oracle 10g中,oracle,oracle11g,oracle10g,Oracle,Oracle11g,Oracle10g,在Oracle11g中,允许设置会话和系统参数,称为。当您需要执行某些语句并且资源被高度使用(为了避免)时,它非常有用 但情况是10g中没有这样的参数 当然,我可以使用这样的共建: DECLARE START_DATE DATE := SYSDATE; BEGIN LOOP IF SYSDATE>START_DATE+30/60/60/24 THEN EXIT; END IF; BEGIN <some statement>
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;
声明开始日期:=SYSDATE;
开始
环
如果系统日期>开始日期+30/60/60/24,则
出口
如果结束;
开始
出口
当其他人
如果sqlcode!=-54那么
提高;
如果结束;
结束;
端环;
结束;
通过使用它,我将尝试在一个周期内执行语句30秒,但这里的问题是,该语句执行了很多次,可能会引起一些麻烦(我不确定,但我不知怎么感觉到了),但是使用ddl\u lock\u timeout
语句只执行一次,然后等待更为混乱的资源
有什么想法吗?这就是为什么锁表不一定工作的原因
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.
锁表-技巧可能不会在所有情况下都有效。
第1次会议:第2次会议:
创建表1(一个数字);
在表1中插入数值(1);
犯罪
更新表1设置a=2;
以独占模式锁定表1;
犯罪
“表已锁定。”
更新表1设置a=3;你想要实现什么?Oracle的建议是:“不要将DDL用于业务逻辑”。谢谢。你说得对,我的答案行不通,我会删除它。我想现在最好的答案是“没有好的选择”。