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 --