ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 学习动态视图(六) v$lock

学习动态视图(六) v$lock

原创 Linux操作系统 作者:等待和希望 时间:2008-07-22 14:53:48 0 删除 编辑

动态视图学习计划

考OCP的时候就对lock这部分内容掌握的比较差,现在看到相关的内容时心里也比较虚。这次整理把文档好好看了看,觉得有些头绪,不过整理的内容还是最初级最常用的一些,并没有深入。

Types of Locks
DML locks (data locks)             DML locks protect data. For example, table locks lock entire tables, row locks lock selected rows.
DDL locks (dictionary locks)    DDL locks protect the structure of schema objects--for example, the definitions of tables and views.
Internal locks and latches        Internal locks and latches protect internal database structures such as datafiles. Internal locks and latches are entirely automatic.
 
DML Locks

当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。在

锁的类型
DML or data locks:
– TM: Table-level locks 表级锁,TM锁包括了SS、SX、S、X等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁,具体参见Oracle文档(注:这里有个问题,在整理过程中发现文档中说select for update会产生RS的TM锁,但事实上,从9206开始,select for update产生的都是RX的TM锁)。
– TX: Row-level locks 事务锁或行级锁

DML事务使用row-level locks,查询不会锁定数据。一个事务至少获得两个锁:一个共享的表锁,一个专有的行锁。Oracle server将所有的锁维护在一个队列里,队列跟踪了等待锁的用户、申请锁的类型以及用户的顺序信息。
Lock在下列情况会释放:commit;rollback;terminated(此时由pmon清理locks)。

测试:
session1和session2连接同一个用户;
session1: update tj set col1=1 where col1=1;

查询v$lock得到结果如下:
ADDR                             KADDR                           SID  TYPE ID1          ID2          LMODE REQUEST CTIME BLOCK
C000000028DD8010 C000000028DD8038 196  TM     48413      0             3             0                 15           2
C000000028ED6370 C000000028ED64E8 196  TX      1441795 384901  6             0                 15           2

session2: update tj set col1=1 where col1=1;

查询V$lock得到结果如下:
ADDR                             KADDR                           SID  TYPE ID1          ID2          LMODE REQUEST CTIME BLOCK
C000000026AE4BB0 C000000026AE4BD0 135  TX      1441795 384901  0             6                  9            0
C000000028DD80E0 C000000028DD8108 135  TM     48413      0             3             0                  9            2
C000000028DD8010 C000000028DD8038 196  TM     48413      0             3             0                 15           2
C000000028ED6370 C000000028ED64E8 196  TX      1441795 384901  6             0                 15           1

* 当session2要获取lmode为6的TX锁时,被session1 block了,处于等待状态。

视图定义

SQL> desc v$lock
 名称                               类型
 -----------                        ---------------
 ADDR                           RAW(8)
 KADDR                         RAW(8)
 SID                                 NUMBER              session id
 TYPE                              VARCHAR2(2)     锁的类型。值包括TM和TX等。Type:PE is used only when you change the system parameters dynamically.
 ID1                                 NUMBER              锁的对象标识。
 ID2                                 NUMBER              锁的对象标识。
 LMODE                          NUMBER             表示会话等待的锁模式的信息。用数字0-6表示
 REQUEST                     NUMBER             表示session请求的锁模式的信息。
 CTIME                             NUMBER
 BLOCK                            NUMBER

SQL> desc v$locked_object
 名称                                       类型
 -----------                                ---------------
 XIDUSN                                NUMBER
 XIDSLOT                               NUMBER
 XIDSQN                                 NUMBER
 OBJECT_ID                          NUMBER
 SESSION_ID                        NUMBER
 ORACLE_USERNAME       VARCHAR2(30)
 OS_USER_NAME                VARCHAR2(30)
 PROCESS                             VARCHAR2(12)
 LOCKED_MODE                  NUMBER

如果你发现session在等待一个锁。那么按如下先后顺序:
1.使用V$LOCK找出session持有的锁。
2.使用V$SESSION找出持有锁或等待锁的session执行的sql语句。
3.使用V$SESSION_WAIT找出什么原因导致session持有锁堵塞。
4.使用V$SESSION获取关于持有锁的程序和用户的更多信息。

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/55472/viewspace-406910/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-05-09

  • 博文量
    39
  • 访问量
    93665