博客文章除注明转载外,均为原创。转载请注明出处。
DDL命令需要对内部结构进行独占锁定。如果这些锁不可用,则某些命令将返回“ORA-00054:资源忙”错误消息,这在尝试修改频繁访问的对象时尤其令人沮丧。为了解决这个问题,Oracle 11g包含了DDL_LOCK_TIMEOUT参数,该参数可以分别使用ALTER SYSTEM和ALTER SESSION命令在实例或会话级别设置。
该DDL_LOCK_TIMEOUT参数指示在抛出资源繁忙错误消息之前,DDL命令应等待锁的时间(秒),默认值为零。
示例如下:
创建一个新表并插入一行,但不提交插入。
--session1会话1
单独保留此会话(不提交)并在新会话中修改该列。立即返回ORA-00054错误。
--session2会话2
如果我们设置ddl_lock_timeout参数为30s,结果相同,还是会返回ORA-00054错误,但返回错误需要30秒。
SQL> l
1 ALTER TABLE lock_tab MODIFY (
2 id NUMBER NOT NULL
3* )
SQL> /
---等待中ing(30s)
如果我们在session2中执行ddl的30s内,对session 1中提交事务
--session1
SQL> commit;
Commit complete.
如果我们重复ALTER TABLE命令并在30秒内在第一个会话中提交插入,ALTER TABLE则将返回成功的消息。
--session2
Table altered.
综上所述
DDL_LOCK_TIMEOUT指定DDL语句在DML锁定队列中等待的时间长度。默认值零表示状态为NOWAIT。最大值1,000,000秒将导致DDL语句永远等待获取DML锁。如果在超时期限到期之前未获取锁定,则返回错误。
--The end