Oracle中的DDL锁
2010-10-01 12:59:08 来源:WEB开发网我们来做个试验,并从dba_ddl_locks视图里查看有关DDL锁定的情况。在该试验中,我们创建一个存储过程,如下所示:
SQL> create or replace procedure p_test is
2 ln_id number;
3 begin
4 dbms_lock.sleep(600);
5 end;
6 /
在该存储过程中,我们调用dbms_lock.sleep,dbms_lock.sleep能够让系统挂起,挂起的时间长度由传入参数决定,传入参数的单位是秒。在本例中,也就是让系统挂起600秒。
然后,我们启动三个session,并检索每个session的SID号,如下所示:
SQL> select sid from v$mystat where rownum=1;
SID
----------
149
SQL> select sid from v$mystat where rownum=1;
SID
----------
151
SQL> select sid from v$mystat where rownum=1;
SID
----------
159
在149号session里我们执行存储过程p_test:
SQL> exec p_test;
这时149号session被挂起,挂起持续的时间为600秒。然后我们到151号session里执行下面的SQL语句,对p_test进行编译:
SQL> alter procedure p_test compile;
我们会发现151号session也被挂起了,因为这时149号session正在执行p_test,因此151号的编译p_test命令必须等待。
接下来,我们到159号session里执行下面的语句,删除p_test:
SQL> drop procedure p_test;
显然,由于151号session正在编译p_test,我们也无法删除p_test,因此159号session也被挂起了。
我们查询dba_ddl_locks视图,来了解这时DDL锁定的情况:
SQL> select session_id,type,mode_held,mode_requested from dba_ddl_locks
2 where session_id in(149,151,159) and wner='HR' and name='P_TEST';
SESSION_ID TYPE MODE_HELD MODE_REQUESTED
---------- --------------------- --------- --------------
159 Table/Procedure/Type Null None
159 Table/Procedure/Type None Exclusive
151 Table/Procedure/Type Exclusive None
149 Table/Procedure/Type Null None
从MODE_HELD列上可以看到,151号session尝试编译p_test,因此它获得了p_test上的排他的DDL锁定。而从MODE_REQUESTED列上可以看到,159号session尝试删除p_test,因此也需要在p_test上添加排他的DDL锁定。但是这时p_test上已经存在DDL锁定了,于是159号session只好等待。
更多精彩
赞助商链接