'的替代方案;ddl_锁定超时';在oracle 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>

在Oracle11g中,允许设置会话和系统参数,称为。当您需要执行某些语句并且资源被高度使用(为了避免)时,它非常有用

但情况是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;
声明开始日期:=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用于业务逻辑”。谢谢。你说得对,我的答案行不通,我会删除它。我想现在最好的答案是“没有好的选择”。