TX导致的等待事件有多个,可以通过视图v$enqueue_statistics来查看每个种类的定义以及描述

本次介绍的是TX-row cache contention.由一个事务加在特定的行上,防止其它事务的更新。
官方文档的介绍如下:

1、欲对其他会话正在修改的记录进行DELETE 或者UPDATE
2、多个进程欲修改唯一索引或者主键索引上的同一值时。
3、并发修改位图索引的键值时。
P1,P2,P3值的含义如下:

P2=USN+SLOT,P3=SEQUENCE
实验1:多个会话并发修改相同的行

--会话1

--会话2;

-执行相同的更新语句,会话1执行成功,会话2 hang住


当有多个TX锁的时候,通过ID1,ID2可以判断哪些竞争的是同一个资源。资源标识符的构成<TYPE-ID1-ID2>
ID1= P2
ID2= P3



P1转化为LMODE和type,
select chr(bitand(1415053318,-16777216)/16777215)|| chr(bitand(1415053318,16711680)/65535) "Lock",
to_char(
bitand(1415053318, 65535) ) "Mode" from dual;

P2转化为USN和SLOT
方法:

UNDO段号11(b),SLOT 26(1a),sequence: 25427

dump相关rollback segment


wyl_ora_4507.trc

Index:事务表槽号,即slot,值为1a。
State: 条目状态,10代表这上面是个活跃事务。9表示非活跃事务
Wrap#:即XIDSQN。如果没有找错,那么跟我们在数据库里面查到的是一致的。

Scn:已提交事务的提交scn。事务槽处于活跃状态的时候,该SCN表示的是开始SCN。
Dba:事务写undo时记录的最后一个undo块的数据块地址。这使ORACLE能够找到该事务生成的最后一条undo记录,以便知道从哪里开始处理回滚。
这个可以使用数据字典查的。

Nub:当前事务使用的undo块数。事务回滚时,该数值会减少
我们可以在对应的数据块上找到锁信息:


wyl_ora_4772.trc

实验2:并发修改唯一键值
--创建唯一索引

--并发插入相同的行

会话1执行成功,会话2hang住
--查看此时的锁信息

此时有2个TX锁,SID=36的会话阻塞SID=50的会话。36持有的锁模式为6,而50请求的锁模式为4,同时它持有另一个模式为6的TX锁资源。
这两个TX很可能一个在索引上,一个在表上。
查看V$SESSION:

ROW_WAIT_OBJ#=-1时,ROW_WAIT_FILE#、ROW_WAIT_BLOCK#、ROW_WAIT_ROW#都为无效值。
接下来验证<TX-524303-38890>位于索引上:

使用这个ID来dump索引:

wyl_ora_4830.trc

SQL>
select dbms_utility.data_block_address_file(4311473) file#,
2
dbms_utility.data_block_address_block(4311473) block# from dual;

从ITL上可以看出来,索引上有个事务,该事务ID: 0x0008.00f.000097ea

转化为ID1,ID2
ID1=8000f=524303
ID2=97ea=38890
与先前的查询结果比对,确定引发竞争的TX锁在唯一索引上





