V$LOCK视图相关知识

联系:手机/微信(+86 17813235971) QQ(107644445)QQ咨询惜分飞

标题:V$LOCK视图相关知识

作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]

1V$LOCK视图结构

列名 类型 字段说明
ADDR RAW(4 | 8) Address of lock state object
KADDR RAW(4|8) Address of lock
SID NUMBER 会话的sid,可以和v$session 关联
TYPE VARCHAR2(2) 区分该锁保护对象的类型(表4)
TM – DML enqueue
TX – Transaction enqueue
UL – User supplied
–我们主要关注TX和TM两种类型的锁
–UL锁用户自己定义的,一般很少会定义,基本不用关注
–其它均为系统锁,会很快自动释放,不用关注
ID1
ID2
NUMBER ID1,ID2的取值含义根据type的取值而有所不同
对于TM
ID1表示被锁定表的object_id 可以和dba_objects视图关联取得具体表信息,ID2 值为0
对于TX
ID1以十进制数值表示该事务所占用的回滚段号和事务槽slot number号,其组形式:
0xRRRRSSSS,RRRR=RBS/UNDO NUMBER,SSSS=SLOT NUMBER
ID2 以十进制数值表示环绕wrap的次数,即事务槽被重用的次数
LMODE NUMBER
  • 0 – none
  • 1 – null (NULL)
  • 2 – row-S (SS)
  • 3 – row-X (SX)
  • 4 – share (S)
  • 5 – S/Row-X (SSX)
  • 6 – exclusive (X)
  • 具体见表3
REQUEST NUMBER 同LMODE
–大于0时,表示当前会话被阻塞,其它会话占有改锁的模式
CTIME NUMBER
  • 已持有或者等待锁的时间
BLOCK NUMBER
  • 是否阻塞其他会话锁申请 1:阻塞 0:不阻塞


2、其它相关视图说明

视图名 描述 主要字段说明
v$session 查询会话的信息和锁的信息。 sid,serial#:表示会话信息。
program:表示会话的应用程序信息。
row_wait_obj#:表示等待的对象,和dba_objects中的object_id相对应。
lockwait :该会话等待的锁的地址,与v$lock的kaddr对应.
v$session_wait 查询等待的会话信息。 sid:表示持有锁的会话信息。
Seconds_in_wait:表示等待持续的时间信息
Event:表示会话等待的事件,锁等于enqueue
dba_locks 对v$lock的格式化视图。 Session_id:和v$lock中的Sid对应。
Lock_type:和v$lock中的type对应。
Lock_ID1: 和v$lock中的ID1对应。
Mode_held,mode_requested:和v$lock中的lmode,request相对应。
v$locked_object 只包含DML的锁信息,包括回滚段和会话信息。 Xidusn,xidslot,xidsqn:表示回滚段信息。和v$transaction相关联。
Object_id:表示被锁对象标识。
Session_id:表示持有锁的会话信息。
Locked_mode:表示会话等待的锁模式的信息,和v$lock中的lmode一致。

表3

锁模式 锁描述 解释 SQL操作
0 none
1 NULL Select
2 SS(Row-S) 行级共享锁,其他对象只能查询这些数据行 Select for update
Lock for update
Lock row share
3 SX(Row-X) 行级排它锁,在提交前不允许做DML操作 Insert/update/Delete
Lock row share
4 S(Share) 共享锁 Create index
Lock share
5 SSX(S/Row-X) 共享行级排它锁 Lock share row exclusive
6 X(Exclusive) 排它锁 Alter table
Drop able
Drop index
Truncate table
Lock exclusive

表4

System Type Description System Type Description
BL Buffer hash table instance NA..NZ Library cache pin instance (A..Z = namespace)
CF Control file schema global enqueue PF Password File
CI Cross-instance function invocation instance PI, PS Parallel operation
CU Cursor bind PR Process startup
DF datafile instance QA..QZ Row cache instance (A..Z = cache)
DL Direct loader parallel index create RT Redo thread global enqueue
DM Mount/startup db primary/secondary instance SC System change number instance
DR Distributed recovery process SM SMON
DX Distributed transaction entry SN Sequence number instance
FS File set SQ Sequence number enqueue
HW Space management operations on a specific segment SS Sort segment
IN Instance number ST Space transaction enqueue
IR Instance recovery serialization global enqueue SV Sequence number value
IS Instance state TA Generic enqueue
IV Library cache invalidation instance TS Temporary segment enqueue (ID2=0)
JQ Job queue TS New block allocation enqueue (ID2=1)
KK Thread kick TT Temporary table enqueue
LA .. LP Library cache lock instance lock (A..P = namespace) UN User name
MM Mount definition global enqueue US Undo segment DDL
MR Media recovery WL Being-written redo log instance
此条目发表在 Oracle性能优化 分类目录。将固定链接加入收藏夹。

V$LOCK视图相关知识》有 3 条评论

  1. 北京-小鹏 说:

    惜分飞,

    hang住是因为有主键,就算没主键 也确实会产生6号

  2. 惜分飞 说:

    lmode=6理解有不同看法:
    6X(Exclusive)排它锁
    指的是排他不一定是ddl。也可能是insert。
    比如同时向一个表里面插入两条相同的数据,使用不同的会话,一个没提交的时候会阻塞另外一个。

    验证插入

    --会话1
    SQL> select sid from v$mystat where rownum=1;
    
           SID
    ----------
            85
    
    SQL> create table t_xifenfei(id number primary key,name varchar2(100));
    
    表已创建。
    
    SQL> insert into  t_xifenfei values(1,'www.xifenfei.com');
    
    已创建 1 行。
    
    --会话2
    SQL> select sid from v$mystat where rownum=1;
    
           SID
    ----------
            96
    
    SQL> insert into t_xifenfei values(1,'WWW.XIFENFEI.COM');
    --hang住
    
    --第三个会话
    SQL> select sid,type,id1,id2,lmode,block from v$lock where sid in(85,96);
    
           SID TY        ID1        ID2      LMODE      BLOCK
    ---------- -- ---------- ---------- ---------- ----------
            96 TX     393262      22163          0          0
            85 TM      90174          0          3          0
            96 TM      90174          0          3          0
            96 TX     327680      22271          6          0
            85 TX     393262      22163          6          1
    
    已选择5行。
    

    验证更新

    --会话1
    SQL> select sid from v$mystat where rownum=1;
    
           SID
    ----------
            99
    
    SQL> insert into t_xifenfei values(1,'WWW.XIFENFEI.COM');
    
    已创建 1 行。
    
    SQL> commit;
    
    提交完成。
    
    SQL> update t_xifenfei set name='XIFENFEI' WHERE ID=1;
    
    已更新 1 行。
    
    
    --会话2
    SQL> select sid from v$mystat where rownum=1;
    
           SID
    ----------
            85
    
    SQL> update t_xifenfei set name='xifenfei' WHERE ID=1;
    --hang住
    
    --会话3
    SQL> select sid,type,id1,id2,lmode,block from v$lock where sid in(85,99);
    
           SID TY        ID1        ID2      LMODE      BLOCK
    ---------- -- ---------- ---------- ---------- ----------
            85 TX     131076      21592          0          0
            99 TM      90174          0          3          0
            85 TM      90174          0          3          0
            99 TX     131076      21592          6          1
    

    确实通过实验,证明dml操作也会引起v$lock的lmode=6.
    一般查询,建议查询v$locked_object

  3. foxmile 说:

    lmode=6理解有不同看法:
    6 X(Exclusive) 排它锁
    指的是排他不一定是ddl。也可能是insert。
    比如同时向一个表里面插入两条相同的数据,使用不同的会话,一个没提交的时候会阻塞另外一个。