enq: TX - row lock/index contention、allocate ITL等待事件

简介:
SQL> select name from v$event_name where name like '%TX%';   NAME   ----------------------------------------------------------------   enq: TX - row lock contention   enq: TX - allocate ITL entry   enq: TX - index contention   enq: TX - contention      enqueue TX事务锁 transaction enqueue,顾名思义这个队列锁用来保护事务信息。   当进程修改某块中的一行数据,则Oracle必须将该事务信息与被改变的这一行联系起来,做法是在块中的row piece的lk上标记ITL位,而实际的ITL记录了这个事务相关的回滚段号USN,以便能够定位其撤销链。 这样做的目的有几个:
  1. 允许用户手动rollback或者因为dead transaction的发生而后台(PMON or SMON 取决于_cleanup_rollback_entries)回滚该事务。
  2. 在块中留下Undo线索,才能让查询者Queryer顺藤摸瓜去构造这个块在事务发生前的镜像块

  绝大多数情况下 ,TX enqueue的申请、获得模式总是排他的exclusive的即mode=6/request=6的(v$LOCK),这通常意味着我们的DML操作所感兴趣的数据行正被其他事务锁定着, 但这并不绝对。   有场景中我们会以共享模式Share mode=4/request=4(V$LOCK)去申请、获得TX enqueue锁; 一种场景是进程仅仅先需要申请到数据块(data block包括table/index)上的 ITL(interested transaction lists)事务槽。 以share mode等待(request=4)TX enqueue 的一种可能就是块上无法再扩展本进程所需要的一个ITL了,要么这个块上的ITL 超过MAXTRANS(255)ITL的上限值了,要么是这个块没有更多的空间来容纳更多一个ITL了,(一个ITL 24字节)。   若争用contention缘起于排他的exclusive TX队列申请,则表明有并发事务试图锁住同一行数据。 大多数情况下这是由于应用引起的。 实际上log file sync(其实是写redo慢)也会造成buffer busy wait。   若争用contention缘起于共享shared TX 队列申请,则有可能是一个或多个数据块无法扩展事务表所导致的。在这种情况下可以考虑增加更大的INITTRANS来解决问题: 对于该问题建议做10046 level 8+ buffer cache dump配合V$SESSION fileid/blockid/objno来诊断问题。   从版本9iR2开始可以通过动态性能视图的V$SEGMENT_STATISTICS来判断对象是否经历ITL 等待 ,但是实例参数 STATISTICS_LEVEL必须设置为typical 以上,可以参考statspack中segment by ITL的环节,当然AWR里也有类似的信息: select owner, object_name from v$segment_statistics where statistic_name = 'ITL waits' and value > 0;   TX锁的 ID1/ID2解释 ID1 是用来存放 USN==> Undo Segment Number以及相关的undo segment transaction slot,通过以下转换获得: (undo_segment_number << 16) + slot ID2是事务槽位序列号



本文转自maclean_007 51CTO博客,原文链接:http://blog.51cto.com/maclean/1277922

相关文章
|
SQL 监控 Oracle
Oracle 数据库发生等待事件:enq: TX - row lock contention ,排查思路
Oracle 数据库发生等待事件:enq: TX - row lock contention ,排查思路
Oracle 数据库发生等待事件:enq: TX - row lock contention ,排查思路
|
存储 缓存 固态存储
存储性能的关键指标:IOPS与吞吐量详解
【4月更文挑战第21天】
3748 0
|
SQL Java 数据库连接
MyBatis 的 3 种分页方式
MyBatis 的 3 种分页方式
725 1
MyBatis 的 3 种分页方式
|
数据可视化
rpm 的降级安装命令是什么?
【6月更文挑战第13天】rpm 的降级安装命令是什么?
663 2
|
定位技术 Python
Python的pyecharts安装,导入map、geo模块,画地图
Python的pyecharts安装,导入map、geo模块,画地图
321 1
|
XML JSON 数据格式
XmlRPC协议详解(一款不支持原生异步请求的协议)
XmlRPC是一种基于XML(eXtensible Markup Language)的远程过程调用协议。它使用简单的文本格式进行通信,将请求和响应数据封装在XML中,广泛应用于Web服务和分布式系统中。
565 0
|
消息中间件 存储 NoSQL
深入学习Redis 消息队列 Stream
Stream 是 Redis 5.0 版本中新增的一种数据结构,它是一个高性能、持久化的消息队列,可以用于实现消息的发布和订阅。Stream 可以看作是一个有序的消息队列,每个消息都有一个唯一的 ID,可以根据 ID 进行消息的查找、删除和确认。在 Stream 中,消息以键值对的形式存储,可以存储任意类型的数据。Stream 还支持多个消费者组,每个消费者组可以独立消费消息,避免消息重复消费。Stream 的引入使得 Redis 在消息队列领域更具竞争力,同时也为开发者提供了一种高效、可靠的消息处理方式
957 0
深入学习Redis 消息队列 Stream
|
SQL 存储 关系型数据库
mysql 利用 performance_schema 排查 qps 过高过程记录
mysql 利用 performance_schema 排查 qps 过高过程记录
560 0
|
SQL 关系型数据库 MySQL
《PostgreSQL与MySQL:详细对比与分析》
《PostgreSQL与MySQL:详细对比与分析》
863 0