在Oracle Database 11g Release 1 (11.1) 中锁的增强如下
1.Serializing Locks
在Oracle 11g中允许DDL语句等待DML锁.就是说当进行DML操作时,如果DML操作还没有完成,DML所持有的锁还没有释放,这时要进行DDL操作,比如删除某列,在oracle 11g以前的版本
中会直接返回一个错误信息,告诉我们资源正忙.而在oracle 11g中则可以由 DDL_LOCK_TIMEOUT这个参数来设定否要等待,等待多久.
DDL_LOCK_TIMEOUT的值默认是0,意为着是NOWAIT.
DDL_LOCK_TIMEOUT最大值可以设置到1000000(秒)意为着DDL语句为了DML锁可以等待11.5天.
详细测试如下
SQL> create table t as select * from all_objects;
表已创建。
C:>sqlplus yxyup
SQL*Plus: Release 11.1.0.6.0 - Production on 星期二 12月 18 20:54:13 2007
Copyright (c) 1982, 2007, Oracle. All rights reserved.
输入口令:
连接到:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
T TABLE
SQL> create table tt as select * from all_objects;
表已创建。
SQL> drop table tt;
表已删除。
SQL> update t set object_name='yxyup' ;
.......
再新开一个session
C:>sqlplus yxyup
SQL*Plus: Release 11.1.0.6.0 - Production on 星期二 12月 18 20:56:42 2007
Copyright (c) 1982, 2007, Oracle. All rights reserved.
输入口令:
连接到:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
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
20:59:34 SQL> alter session set ddl_lock_timeout=10;
会话已更改。
已用时间: 00: 00: 00.00
20:59:47 SQL> alter table t drop column object_name;
alter table t drop column object_name
*
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效
已用时间: 00: 00: 10.07
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是没有限制的,也就是说可以无穷大也可以无穷小了.
详细测试如下
C:>sqlplus yxyup
SQL*Plus: Release 11.1.0.6.0 - Production on 星期二 12月 18 21:42:24 2007
Copyright (c) 1982, 2007, Oracle. All rights reserved.
输入口令:
连接到:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 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的锁还有其他方面的增强,偶将慢慢一点一点的挖掘出来和大家分享