Oracle 11g 鎖特性增加(引數ddl_lock_time)

lwitpub發表於2009-09-04

Oracle Database 11g Release 1 (11.1.0.6.0) 中鎖的增強如下

1.Serializing Locks

Oracle 11g中允許DDL語句等待DML.就是說當進行DML操作時,如果DML操作還沒有完成,DML所持有的鎖還沒有釋放,這時要進行DDL操作,比如刪除某列,oracle 11g以前的版本沒有parameter ddl_lock_time,會直接返回一個錯誤資訊,告訴我們資源正忙.而在oracle 11g中則可以由DDL_LOCK_TIMEOUT這個引數來設定是否要等待,等待多久.

DDL_LOCK_TIMEOUT的值預設是0,意味著NOWAIT.

DDL_LOCK_TIMEOUT最大值可以設定到1000000()意為著DDL語句為了DML鎖可以等待11.5.

詳細測試如下

[oracle@racl ~]$ sqlplus test/test

SQL*Plus: Release 11.1.0.6.0 - Production on 星期五 9月 4 08:47:13 2009

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

連線到:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> create table t as select * from all_objects;

表已建立。

SQL> select * from tab;

TNAME TABTYPE CLUSTERID

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

T TABLE

SQL> update t set object_name='test' ;

.......

再新開一個session,還以test使用者連線,

SQL> show parameter ddl_lock_time;

NAME TYPE VALUE

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

ddl_lock_timeout     integer     0

SQL> alter table t drop column object_name;

alter table t drop column object_name

*

1 行出現錯誤:

ORA-00054: 資源正忙, 但指定以 NOWAIT 方式獲取資源, 或者超時失效

SQL> alter session set ddl_lock_timeout=5;

會話已更改。

SQL> set time on

20:59:19 SQL> set timing on

20:59:24 SQL> alter table t drop column object_name;

alter table t drop column object_name

*

1 行出現錯誤:

ORA-00054: 資源正忙, 但指定以 NOWAIT 方式獲取資源, 或者超時失效

已用時間: 00: 00: 05.09

21:00:02 SQL> alter session set ddl_lock_timeout=0;

會話已更改。

已用時間: 00: 00: 00.00

21:00:12 SQL> alter table t drop column object_name;

alter table t drop column object_name

*

1 行出現錯誤:

ORA-00054: 資源正忙, 但指定以 NOWAIT 方式獲取資源, 或者超時失效

已用時間: 00: 00: 00.04

2.Locking Tables

我們知道在oracle 10g當執行LOCK TABLE命令時,如果正好有其他使用者對這個表持有了鎖,這時或是無限期的等待或是直接不等待(NOWAIT clause ).而在oracle 11g LOCK TABLE命令有了一個新子句,這個新子句允許我們指定一個等待DML鎖的時間,詳細語法如下:

LOCK TABLE … IN lockmode MODE [NOWAIT | WAIT integer]

可以看出比oracle 10g多了一個WAIT integer clause,並且這個integer是沒有限制的,也就是說可以無窮大也可以無窮小了.

詳細測試如下

[oracle@racl ~]$ sqlplus test/test

SQL*Plus: Release 11.1.0.6.0 - Production on 星期五 9月 4 08:47:13 2009

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

連線到:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

22:34:42 SQL> create table tt as select * from t where rownum<10;

表已建立。

已用時間: 00: 00: 00.67

22:35:00 SQL> delete tt;

已刪除9行。

已用時間: 00: 00: 00.03

新開一個session 2

22:34:37 SQL> show user;

USER "YXYUP"

22:36:02 SQL> lock table tt in exclusive mode nowait;

lock table tt in exclusive mode nowait

*

1 行出現錯誤:

ORA-00054: 資源正忙, 但指定以 NOWAIT 方式獲取資源, 或者超時失效

已用時間: 00: 00: 00.01

22:36:04 SQL> lock table tt in exclusive mode wait 10 ;

lock table tt in exclusive mode wait 10

*

1 行出現錯誤:

ORA-00054: 資源正忙, 但指定以 NOWAIT 方式獲取資源, 或者超時失效

已用時間: 00: 00: 10.03

22:36:32 SQL>

當然oracle 11g的鎖還有其他方面的增強。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/628922/viewspace-613958/,如需轉載,請註明出處,否則將追究法律責任。

相關文章