暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

enq:TX -row lock contention原理及实验

原创 哈萨雅琪 2021-11-11
3247

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>位于索引上:


使用这个IDdump索引:


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


转化为ID1ID2

ID1=8000f=524303

ID2=97ea=38890

 

与先前的查询结果比对,确定引发竞争的TX锁在唯一索引上


最后修改时间:2022-06-30 12:00:56
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论