联系:手机/微信(+86 17813235971) QQ(107644445)
标题:V$LOCK视图相关知识
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
1、V$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 | 
  | 
| REQUEST | NUMBER | 同LMODE –大于0时,表示当前会话被阻塞,其它会话占有改锁的模式  | 
| CTIME | NUMBER | 
  | 
| BLOCK | NUMBER | 
  | 
 
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 | 
lmode=6理解有不同看法:
6 X(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
惜分飞,
hang住是因为有主键,就算没主键 也确实会产生6号