Chinaunix首页 | 论坛 | 博客
  • 博客访问: 777980
  • 博文数量: 99
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1163
  • 用 户 组: 普通用户
  • 注册时间: 2016-09-22 09:50
个人简介

一个守望数据库的老菜鸟

文章分类

全部博文(99)

文章存档

2019年(21)

2018年(17)

2017年(37)

2016年(24)

我的朋友

分类: Oracle

2019-01-17 14:27:19

博客文章除注明转载外,均为原创。转载请注明出处。



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
阅读(12159) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~