11g以前,DDL 語句是不會等待DML語句的,當DDL語句通路的對象正在執行的DML語句,會立即報錯ORA-00054: 資源正忙, 但指定以 NOWAIT 方式擷取資源, 或者逾時失效。而在11g以後,DDL_LOCK_TIMEOUT參數可以修改這一狀态,當DDL_LOCK_TIMEOUT=0時,DDL 不等待DML,當DDL_LOCK_TIMEOUT 為N(秒)時,DDL等待DML N 秒!
版本:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
<b>session 1</b>
建立測試表
yang@rac1>create table yangtab as select * from all_objects where rownum
表已建立。
對表執行DML
yang@rac1>update yangtab set object_name='yangql';
已更新199行。
yang@rac1>show parameter ddl_lock
NAME TYPE VALUE
------------------------------------ ----------- ----------
ddl_lock_timeout integer 0
yang@rac1>update yangtab set wner='yangql';
session 2 對表執行ddl操作
yang@rac1>alter table yangtab drop column owner;
alter table yangtab drop column owner
*
第 1 行出現錯誤:
ORA-00054: 資源正忙, 但指定以 NOWAIT 方式擷取資源, 或者逾時失效
已用時間: 00: 00: 00.01 --注意時間
設定 ddl_lock_timeout =10 秒,實作DDL語句等待DML語句
yang@rac1>alter session set ddl_lock_timeout=10;
會話已更改。
已用時間: 00: 00: 00.10
已用時間: 00: 00: 10.03 --等待時間接近10秒
yang@rac1>alter session set ddl_lock_timeout=8;改為8秒
已用時間: 00: 00: 00.02
已用時間: 00: 00: 08.01 --等待8秒
yang@rac1>alter session set ddl_lock_timeout=0;
已用時間: 00: 00: 00.00
綜上,設定ddl_lock_timeout為N(秒)後,DDL執行後将等待N秒鐘後才抛出報錯資訊。在ddl_lock_timeout為預設值 0 時,DDL語句送出之後馬上報錯。
官方解釋如下:
Property
Description
Parameter type
Integer
Default value
Modifiable
ALTER SESSION
Range of values
0 to 1,000,000 (in seconds)
Basic
No