Oracle的锁

上一篇 / 下一篇  2008-07-08 16:37:20 / 个人分类:Oracle管理

参考资料:《Oracle 9i&10g编程艺术》

锁的类型:
DML锁:通常在SELECT、INSERT、UPDATE、MERGE和DELETE语句中出现,DML锁允许并发执行数据修改,只在特定数据行上锁。
DDL锁:通常在CREATE和ALTER语句中出现,DDL锁可以保护对象结构定义。
内部锁和latches:Oracle使用这些锁来保护其内部数据结构。(本文不介绍)

  • DML锁

用于确保一次只有一个人能修改某一行,而且正在处理的一个表不能被删除。
1.TX锁(事务锁)
事务中修改数据时会得到TX锁,且会一直持有这个锁,直至事务执行提交或回滚,TX锁一种排队机制的资源。
SQL> update dept set deptno = deptno+10;
4 rows updated.

SQL> select username,
  2  v$lock.sid,
  3  trunc(id1/power(2,16)) rbs,
  4  bitand(id1,to_number('ffff','xxxx'))+0 slot,
  5  id2 seq,
  6  lmode,
  7  request
  8  from v$lock, v$session
  9  where v$lock.type = 'TX'
 10  and v$lock.sid = v$session.sid
 11  and v$session.username = USER;
USERNAME        SID        RBS       SLOT        SEQ      LMODE    REQUEST
-------- ---------- ---------- ---------- ---------- ---------- ----------
TEST            158          4          4       2082          6          0

SQL> select XIDUSN, XIDSLOT, XIDSQN from v$transaction;

    XIDUSN    XIDSLOT     XIDSQN
---------- ---------- ----------
         4          4       2082
 
2.TM锁
TM锁用于确保在修改表中的数据时,表的结构不会改变。
session1:
SQL> update dept set deptno = deptno+10;
4 rows updated.
session2:
SQL> drop table dept;
drop table dept
           *
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified

  • DDL锁
    在DDL操作中会自动为对象加DDL锁,从而保护这些对象不会被其他会话所修改。

有3种类型的DDL锁:
1.排他DDL锁
阻止其他会话得到它们自己的DDL锁或TM锁。
Alter table t add new_column date;

2.共享DDL锁
保护所引用对象的结构,使之不会被其他会话修改,但是允许修改数据。
create index t_idx on t(x) ONLINE;

另外一类DDL会获得共享DDL锁。在创建存储的编译对象(如过程和视图)时,对依赖的对象加这种共享DDL锁。
例如,如果执行以下语句:
Create view MyView as select * from emp, dept where emp.deptno = dept.deptno;
CREATE VIEW命令处理过程中,表EMP和DEPT上都会加共享DDL锁,可以修改这些表的数据,但是不能修改它们的结构。

3.可中断解析锁(breakable parse lock)
这个锁允许一个对象向另外的对象注册其依赖性。
会话解析一条语句时,对于该语句引用的每一个对象都会加可中解析锁。这个锁的目的是:如果以某种方式删除或修改了一个被引用的对象,可以将共享池中已解析的缓存语句置为无效。

DBA_DDL_LOCKS视图,可查看共享池中锁定的对象

SQL> create or replace procedure p as begin null; end;
  2  /
Procedure created.

SQL> exec p;
PL/SQL procedure successfully completed.

SQL> select session_id sid,owner,name,type,mode_held held,mode_requested request from dba_ddl_locks;
       SID OWNER                NAME                           TYPE                           HELD      REQUEST
---------- -------------------- ------------------------------ ------------------------------ --------- ---------
       162 SYS                  SCHEDULER$_INSTANCE_S          Table/Procedure/Type           Null      None
       161 SYS                  ALERT_QUE_R                    23                             Null      None
       161 SYS                  ALERT_QUE_R                    23                             Null      None
       161 SYS                  DBMS_HA_ALERTS_PRVT            Table/Procedure/Type           Null      None
       161 SYS                  DBMS_RCVMAN                    Table/Procedure/Type           Null      None
       161 SYS                  DBMS_APPLICATION_INFO          Body                           Null      None
       161 SYS                  AQ$_ALERT_QT_E                 10                             Null      None
       161 SYS                  DBMS_RCVMAN                    Body                           Null      None
       161 SYS                  STANDARD                       Body                           Null      None
       161 SYS                  DBMS_BACKUP_RESTORE            Body                           Null      None
       161 SYS                  DBMS_APPLICATION_INFO          Table/Procedure/Type           Null      None

       SID OWNER                NAME                           TYPE                           HELD      REQUEST
---------- -------------------- ------------------------------ ------------------------------ --------- ---------
       161 SYS                  DBMS_PRVT_TRACE                Body                           Null      None
       161 SYS                  STANDARD                       Table/Procedure/Type           Null      None
       161 SYS                  PLITBLM                        Table/Procedure/Type           Null      None
       161 SYS                  PLITBLM                        Table/Procedure/Type           Null      None
       161 SYS                  DBMS_PRVT_TRACE                Table/Procedure/Type           Null      None
       161 SYS                  DBMS_HA_ALERTS_PRVT            Body                           Null      None
       158 SYS                  DBMS_APPLICATION_INFO          Body                           Null      None
       158 SCOTT                SCOTT                          18                             Null      None
       158 SYS                  DATABASE                       18                             Null      None
       158 SCOTT                P                              Table/Procedure/Type           Null      None
       145 SYS                  DATABASE                       18                             Null      None

       SID OWNER                NAME                           TYPE                           HELD      REQUEST
---------- -------------------- ------------------------------ ------------------------------ --------- ---------
       158 SYS                  DBMS_APPLICATION_INFO          Table/Procedure/Type           Null      None
       161 SYS                  DBMS_BACKUP_RESTORE            Table/Procedure/Type           Null      None
      
这里可看到过程P在视图中出现。

SQL> alter procedure p compile;
Procedure altered.

SQL> select session_id sid,owner,name,type,mode_held held,mode_requested request from dba_ddl_locks;

       SID OWNER                NAME                           TYPE                           HELD      REQUEST
---------- -------------------- ------------------------------ ------------------------------ --------- ---------
       162 SYS                  SCHEDULER$_INSTANCE_S          Table/Procedure/Type           Null      None
       161 SYS                  ALERT_QUE_R                    23                             Null      None
       161 SYS                  ALERT_QUE_R                    23                             Null      None
       161 SYS                  DBMS_HA_ALERTS_PRVT            Table/Procedure/Type           Null      None
       161 SYS                  DBMS_RCVMAN                    Table/Procedure/Type           Null      None
       161 SYS                  DBMS_APPLICATION_INFO          Body                           Null      None
       161 SYS                  AQ$_ALERT_QT_E                 10                             Null      None
       161 SYS                  DBMS_RCVMAN                    Body                           Null      None
       161 SYS                  STANDARD                       Body                           Null      None
       161 SYS                  DBMS_BACKUP_RESTORE            Body                           Null      None
       161 SYS                  DBMS_APPLICATION_INFO          Table/Procedure/Type           Null      None

       SID OWNER                NAME                           TYPE                           HELD      REQUEST
---------- -------------------- ------------------------------ ------------------------------ --------- ---------
       161 SYS                  DBMS_PRVT_TRACE                Body                           Null      None
       161 SYS                  STANDARD                       Table/Procedure/Type           Null      None
       161 SYS                  PLITBLM                        Table/Procedure/Type           Null      None
       161 SYS                  PLITBLM                        Table/Procedure/Type           Null      None
       161 SYS                  DBMS_PRVT_TRACE                Table/Procedure/Type           Null      None
       161 SYS                  DBMS_HA_ALERTS_PRVT            Body                           Null      None
       158 SYS                  DBMS_APPLICATION_INFO          Body                           Null      None
       158 SCOTT                SCOTT                          18                             Null      None
       158 SYS                  DATABASE                       18                             Null      None
       145 SYS                  DATABASE                       18                             Null      None
       158 SYS                  DBMS_APPLICATION_INFO          Table/Procedure/Type           Null      None

       SID OWNER                NAME                           TYPE                           HELD      REQUEST
---------- -------------------- ------------------------------ ------------------------------ --------- ---------
       161 SYS                  DBMS_BACKUP_RESTORE            Table/Procedure/Type           Null      None
      
重新编译过程P后,它从DBA_DDL_LOCKS视图中消失,说明解析锁被中断了。


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-10-12  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 1841
  • 日志数: 32
  • 文件数: 2
  • 建立时间: 2008-04-16
  • 更新时间: 2008-08-26

RSS订阅

Open Toolbar