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的参考
官方文档连接:
DDL_LOCK_TIMEOUT
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 --
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70034820/viewspace-2994229/
,如需转载,请注明出处,否则将追究法律责任。