Session 2_SQL> insert into text values(2,2);
SQL> select * from v$resource where type ='TM';
ADDR TY ID1 ID2
---------------- -- ---------- ----------
00000000BEE1C1D0 TM 88956 0
可以看到有一个TM队列锁,地址为BEE1C1D0,88956即指向text表,可用以下方法验证:
SQL> select object_name from dba_objects where object_id=88956;
OBJECT_NAME
----------------------------------------
TEXT
查看V$lock视图
SQL> select * from v$lock where id1=88956;
ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK
---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
00007F54354D22A0 00007F54354D2300 175 TM 88956 0 3 0 25 0
00007F54354D22A0 00007F54354D2300 45 TM 88956 0 3 0 484 0
可见,TM-88956-0是3号锁,由两个会话持有
五、观察队列结构
我们可以用这条语句Dump出队列结构详细信息
alter session set events 'immediate trace name enqueues level 4';
SQL> create table aaa(id int,text varchar2(20));
Table created.
SQL> insert into aaa values(1,'aa');
1 row created.
SQL> alter session set events 'immediate trace name enqueues level 4';
Session altered.
[oracle@localhost trace]$ more orcl_ora_23617.trc
*** 2017-06-09 22:49:41.117
===================================================
ENQUEUES 表示队列信息
--------
Active: lock: (nil), resource: (nil)
Global: name: ORCL
Hash: length: 539, at: 0xbee3d470
Hash表:这里有两个值,一个指向列表开头,一个指向列表结尾;如果两个值相等,那么就说明只有1个。
[bee3d470,bee3d470] [bee3d4a0,bee3d4a0] [bee3d4d0,bee3d4d0]
[bee3d500,bee3d500] [bee3d530,bee3d530] [bee3d560,bee3d560]
[bee3d590,bee3d590] [bee3d5c0,bee3d5c0] [bee3d5f0,bee3d5f0]
[bee3d620,bee3d620] [bee3d650,bee3d650] [bee3d680,bee3d680]
[bee3d6b0,bee3d6b0] [bee3d6e0,bee3d6e0] [bee118b0,bee118b0]
[bee3d740,bee3d740] [bee3d770,bee3d770] [bee3d7a0,bee3d7a0]
[bee3d7d0,bee3d7d0] [bee3d800,bee3d800] [bee3d830,bee3d830]
[bee3d860,bee3d860] [bee3d890,bee3d890] [bee3d8c0,bee3d8c0]
[bee3d8f0,bee3d8f0] [bee3d920,bee3d920] [bee3d950,bee3d950]
[bee3d980,bee3d980] [bee3d9b0,bee3d9b0] [bee3d9e0,bee3d9e0]
[bee3da10,bee3da10] [bee3da40,bee3da40] [bee3da70,bee3da70]
[bee3daa0,bee3daa0] [bee3dad0,bee3dad0] [bee3db00,bee3db00]
[bee3db30,bee3db30] [bee3db60,bee3db60] [首指针bee11938,bee11938尾指针]
略过......... ( [bee3db30,bee3db30] 即hash表中记载的队列锁在资源队列池中的地址)
-------------------------------------------------------------------------
中间很多锁,略过
-------------------------------------------------------------------------
TM-00015b0e-00000000 队列标识,标识TM锁,指向表aaa(00015b0e是16进制,转换成10进制为88846,即对应表aaa的object_id)
res: 0xbee1da88 , flags: (0x6) ALO/-/USR/-/-/- 这里开始描述资源结构
held counts: NULL=0 , SS=0 , SX=1 , S=0 , SSX=0 , X=0 (bmask: 0x8) 描述锁的级别
lock value: 00000000 00000000 00000000 00000000
htb(0xbee1da88): [bee435f0,bee435f0]
own(0xbee1da98): [bbe33318,bbe33318] 持有者队列信息
cnv(0xbee1dab8): [bee1dab8,bee1dab8] 转换者队列信息
wtr(0xbee1daa8): [bee1daa8,bee1daa8] 等待者队列信息
lock summary:
OWN: L1:SX 持有者队列信息
CNV: 转换者队列信息
WTR: 等待者队列信息
# of incomp w/ SS converters: 0
# of incomp w/ SS waiters: 0
lock details: 描述锁的详细信息
lock lst hold wait sid:ser owner link
-------------------------------------------------------------------------
L1: 0xbbe33308 OWN SX -- 45:3 0xbe6caab0 [bee1da98,bee1da98] 这里一般都会指向下一个,一样的原因是当前只有一个