【LOCK】11g中允许DDL锁等待DML锁

11g中使用DDL_LOCK_TIMEOUT参数可以允许DDL锁等待DML锁,在这个技术没有被引入的时候,DDL操作将不等待DML操作,直接给出“ORA-00054”报错信息。

1.创建测试表T
sec@11gR2> create table t (x number);

Table created.

2.插入一条数据,不进行提交
sec@11gR2> insert into t values ('6');

1 row created.

3.如何让DDL等待DML完成?
11g中引入了ddl_lock_timeout参数,使用这个参数可以完成这个光荣的使命。
ddl_lock_timeout参数默认值是“0”,表示DDL语句不等待DML语句,就是说DDL语句的执行优先级较高。
sec@11gR2> show parameter ddl_lock_timeout

NAME                                     TYPE                 VALUE
---------------------------------------- -------------------- ------------------------------------------------------------
ddl_lock_timeout                         integer              0

4.修改ddl_lock_timeout参数实现DDL语句等待DML语句
在新开启一个session,执行DDL的DROP表操作。
sec@11gR2> alter session set ddl_lock_timeout=10;

Session altered.

sec@11gR2> set timing on
sec@11gR2> set time on
09:37:15 sec@11gR2> drop table t purge;
drop table t purge
           *
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired


Elapsed: 00:00:10.02
09:37:25 sec@11gR2>

可见,在设置ddl_lock_timeout为10(秒)后,DDL执行后将等待10秒钟,然后再抛出报错信息。
在ddl_lock_timeout为默认值“0”的时候,DDL提交之后将马上获得这个报错信息。

5.关于参数DDL_LOCK_TIMEOUT的参考
官方文档连接:http://download.oracle.com/docs/cd/B28359_01/server.111/b28320/initparams068.htm#REFRN10267

DDL_LOCK_TIMEOUT

Property Description
Parameter type Integer
Default value 0
Modifiable ALTER SESSION
Range of values 0 to 1,000,000 (in seconds)
Basic No

DDL_LOCK_TIMEOUT specifies a time limit for how long DDL statements will wait in a DML lock queue. The default value of zero indicates a status of NOWAIT. The maximum value of 1,000,000 seconds will result in the DDL statement waiting forever to acquire a DML lock.

If a lock is not acquired before the timeout period expires, then an error is returned.


ddl_lock_timeout参数允许设置的最大值是1,000,000秒(相当于11天的时间,已经足够长)。

6.小结
11g在锁管理上更进一步,让我们有了更大的控制空间,善用之。

Good luck.

secooler
10.05.17

-- The End --

请使用浏览器的分享功能分享到微信等