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个视图连接上.??望高手给予解答

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐