lock object oracle,V$LOCK和V$LOCK_OBJECT的关系和区别:
V$LOCK和V$LOCK_OBJECT的关系和区别:v$locked_object视图列出当前系统中哪些对象正被锁定.v$lock视图列出当前系统持有的或正在申请的所有锁的情况.\\首先用 2条sql语句update同一行数据,模拟TX mode=6的锁Session 1:SQL>update e set e=1 where e=1;Sql completeSession 2:SQL>
V$LOCK和V$LOCK_OBJECT的关系和区别:
v$locked_object视图列出当前系统中哪些对象正被锁定.
v$lock视图列出当前系统持有的或正在申请的所有锁的情况.
\\首先用 2条sql语句update同一行数据,模拟TX mode=6的锁
Session 1:
SQL>update e set e=1 where e=1;
Sql complete
Session 2:
SQL> update e set e=1 where e=1;
发生等待
Session 3:
SQL>CONNECT / as sysdba
\\查询所有的tx和tm所,update语句主要产生这2个锁
SQL>select * from v$lock where TYPE=’TX’ or TYPE=’TM;
ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK
-------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
68C342DC 68C342F0 140 TX 1638404 32 0 6 4645 0
68FD7D44 68FD7D5C 150 TM 53173 0 3 0 4657 0
68FD7E08 68FD7E20 140 TM 53173 0 3 0 4645 0
68FD7ECC 68FD7EE4 141 TM 50896 0 3 0 0 0
68068D64 68068E80 141 TX 1572910 37 6 0 0 0
68080524 68080640 150 TX 1638404 32 6 0 4657 1
注意,我们可以看到产生的所有锁(sid=140的update语句产生的TM意向锁和TX mode=6的exclusive lock)+(sid=150的update语句产生的TM意向锁和TX=6的锁等待)
\\我们再来看一下V$LOCK_OBJECT
SQL>select * from v$lock_object;
SQL> run
1* select * from v$locked_object
XIDUSN XIDSLOT XIDSQN OBJECT_ID SESSION_ID ORACLE_USERNAME
---------- ---------- ---------- ---------- ---------- ----------------
OS_USER_NAME PROCESS LOCKED_MODE
------------------------------ ------------ -----------
0 0 0 53173 140 SCOTT
1A04DE5D44B84A0\Administrator 1760:1924 3
25 4 32 53173 150 SCOTT
1A04DE5D44B84A0\Administrator 2868:3280 3
在这里我们只能看到2个mode为3的TM锁.
所以V$LOCK_OBJECT只能报发生等待的表级锁,不能报发生等待的row lock.
(我的推测,希望高手给予解答这个推测是否正确??)
我们再来说一下v$lock表中TX锁的ID1,ID2,TM锁的ID1参数及v$locked_object表中XIDUSN,XIDSLOT,XIDSON之间的关系:
V$lock 上:
TYPE ID1 ID2
TM 被修改表的标识(object_id) 0
TX 以十进制数值表示该事务所占用的回滚段号与该事务在该回滚段的事务表(Transaction table)中所占用的槽号(slot number,可理解为记录号)。其组成形式为: 0xRRRRSSSS ( RRRR = RBS number, SSSS = slot )。 以十进制数值表示环绕(wrap)次数,即该槽(slot)被重用的次数;
那上面的例子:计算sid=140的TX锁,占的回滚段,slot number,slot重用的次数.
SQL> select trunc(1638404/65536),mod(1638404,65536) from dual
TRUNC(1638404/65536) MOD(1638404,65536)
-------------------- ------------------
25 4
这个值正好对应v$locked_object XIDUSN, XIDSLOT,XIDSON(v$Lock中ID2的值)
另外这3个值还能够标识一个trancation.
\\通过v$transcation查询发生等待的transcation获取发生等待的sql语句
1 select se.username,sq.sql_text
2 from v$transaction tr,v$session se,v$sql sq
3 where tr.XIDUSN=25 and tr.XIDSLOT=4 and tr.XIDSQN=32 and se.SQL_ADDRESS=sq.ADDRESS
4* and se.SQL_HASH_VALUE=sq.HASH_VALUE and se.TADDR=tr.ADDR
未选定行
这是我开始的时候一个异想天开的想法,分步来看原因:
SQL>1 select * from v$transaction tr
2* where tr.XIDUSN=25 and tr.XIDSLOT=4 and tr.XIDSQN=32
ADDR XIDUSN XIDSLOT XIDSQN UBAFIL UBABLK UBASQN UBAREC STATUS
-------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
68080524 25 4 32 8 2204 16 34 ACTIVE
有结果,transaction的addr是68080524
SQL>1 select SADDR, USERNAME,SQL_HASH_VALUE,SQL_ADDRESS from v$session
2* where taddr='68080524'
SADDR USERNAME SQL_HASH_VALUE SQL_ADDR
-------- ------------------------------ -------------- --------
6973490C SCOTT 0 00
没有sql_hash_value,sql_addr说明sql语句已经执行完毕,因为v$session只能查询正在执行的sql语句,所以这里需要到v$sql 中去查.但是我不知道怎么去把v$transcation和v$sql这2个视图连接上.??望高手给予解答
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)