相关文章推荐
冷冷的芒果  ·  解决Idea的Generate ...·  2 月前    · 
老实的稀饭  ·  package-lock.json ...·  1 年前    · 
小胡子的火锅  ·  python - ...·  1 年前    · 

在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

Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing optionsSQL> create table t as select * from all_objects;

表已创建。

SQL> select * from tab;

TNAMETABTYPECLUSTERID

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

TTABLE

SQL> update t set object_name='test' ;

.......

再新开一个session,还以test用户连接,

SQL> show parameter ddl_lock_time;

NAMETYPEVALUE

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

ddl_lock_timeoutinteger    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中LOCKTABLE命令有了一个新子句,这个新子句允许我们指定一个等待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

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> deletett;

已删除9行。

已用时间:00: 00: 00.03

新开一个session 2

22:34:37 SQL> show user;

USER为"YXYUP"

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

lock table ttin exclusive mode nowait

第1行出现错误:

ORA-00054:资源正忙,但指定以NOWAIT方式获取资源,或者超时失效

已用时间:00: 00: 00.01

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

lock table ttin exclusive mode wait 10

第1行出现错误:

ORA-00054:资源正忙,但指定以NOWAIT方式获取资源,或者超时失效

已用时间:00: 00: 10.03

22:36:32 SQL>

当然oracle 11g的锁还有其他方面的增强。

在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 _HOME%/network/admin/sqlnet.ora文件 最后一样 添加 参数 SQLNET.EXPIRE_ TIME = 2 但为是分钟 默认不要 设置 的太大 容易引起 session过多 添加后重启 oracle 服务 转载于:https://www.cnblogs.com/liaomin416100569/a...
oralce数据库 查询死 的表: select object_name,machine,s.sid,s.serial# from v$ lock ed_object l,dba_objects o ,v$session s where l.object_id = o.object_id and l.session_id=s.sid; 杀掉死 会话:取上一步sql中的
Oracle 中,可以使用 `DBMS_METADATA.GET_ DDL ` 过程获取对象的 DDL (数据定义语言)语句,以便于在其他地方重建相同的对象。 下面是使用 `GET_ DDL ` 过程获取表 `EMPLOYEES` 的 DDL 语句的示例: SET LONG 10000 SELECT DBMS_METADATA.GET_ DDL ('TABLE', 'EMPLOYEES') FROM DUAL; 这个查询将返回 `EMPLOYEES` 表的 DDL 语句,可以将其复制到其他地方以重新创建表。 需要注意的是,`GET_ DDL ` 过程需要有相应的权限才能够使用。如果当前用户没有权限,则需要通过 `GRANT` 命令授予相应的权限。