天天看點

【11g新特性】DDL_LOCK_TIMEOUT的作用DDL_LOCK_TIMEOUT

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&gt;create table yangtab as select * from all_objects where rownum

表已建立。

對表執行DML 

yang@rac1&gt;update yangtab set object_name='yangql';

已更新199行。

yang@rac1&gt;show parameter ddl_lock

NAME                                 TYPE        VALUE

------------------------------------ ----------- ----------

ddl_lock_timeout                     integer     0

yang@rac1&gt;update yangtab set wner='yangql';

session 2 對表執行ddl操作

yang@rac1&gt;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&gt;alter session set ddl_lock_timeout=10;

會話已更改。

已用時間:  00: 00: 00.10

已用時間:  00: 00: 10.03 --等待時間接近10秒

yang@rac1&gt;alter session set ddl_lock_timeout=8;改為8秒

已用時間:  00: 00: 00.02

已用時間:  00: 00: 08.01 --等待8秒

yang@rac1&gt;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