[Oracle] enq: TX - row lock contention 优化案例

根据开发反馈,最近每天早上7:30应用会报警,应用的日志显示数据库连接池满了,新的连接被拒绝。

首先,我做了ASH报告(报告区间:7:25 ~ 7:35),从ASH的等待事件发现enq: TX - row lock contention居然高达76.54%,如下所示:

Top User Events

Event Event Class % Event Avg Active Sessions
enq: TX - row lock contention Application 76.54 0.81
CPU + Wait for CPU CPU 12.76 0.14
db file sequential read User I/O 7.40 0.08

enq: TX - row lock contention等待事件是一种行的等待事件,也就是说同一时刻有多个session请求修改同一行。

下一步就是找这个等待事件主要由哪些SQL引起的:

Top SQL with Top Events

SQL ID Planhash Sampled # of Executions % Activity Event % Event Top Row Source % RwSrc SQL Text
4rm17788qwxuy 1272661853 54 69.45 enq: TX - row lock contention 69.45 UPDATE 69.45 update shift_case set expertId...
1cqbcdr0ufyk6 1272661853 10 5.20 enq: TX - row lock contention 5.20 UPDATE 5.20 update shift_case set daySecti...
1anu5c146v8d7 1272661853 4 1.89 enq: TX - row lock contention 1.89 UPDATE 1.89 update shift_case set daySecti...
gbw4zk8jv0n0u 2588599834 10 1.57 CPU + Wait for CPU 0.79 TABLE ACCESS - BY GLOBAL INDEX ROWID 0.47 select sc.scId, sc.estId, ct.c...
dvmk92c1umc97 905317021 9 1.42 CPU + Wait for CPU 1.42 CONNECT BY - NO FILTERING WITH START-WITH 0.63 select h.hospitaluuid id, h.pl...

从上表可以得出,SQL_ID=4rm17788qwxuy的SQL语句是罪魁祸首,改SQL语句如下:

4rm17788qwxuy update shift_case set expertId = :1 , shiftDate = :2 , daySection = :3 , rcLimit = :4 , orderingCount = :5 , shareRccount = :6 , clinicTypeUuid = :7 , fee = :8 , isTimeDivision = :9 , state = :10 , isopen=:11 , stateTime = :12 , updateTime = sysdate where scId
=:13

scid是shift_case的主键,也就是说同一时刻有非常多的session在请求更新同一行。

好了,既然已经定位到问题就好办了,马上把应用开发人员找来一问,真相大白:原来该应用需要从外部系统获取数据,为了让内部的数据库和外部的尽量保持一致,每次查询外部系统时,会在数据库里执行update语句。

解决办法也简单:由于每次的Update都会把前一次的update覆盖(等于前面的update做的都是无用功),所以根本没必要每次查询都update,只要最后一次查询做update就可以了。

[Oracle] enq: TX - row lock contention 优化案例

时间: 2024-11-07 04:38:25

[Oracle] enq: TX - row lock contention 优化案例的相关文章

ORACLE等待事件:enq: TX - row lock contention

enq: TX - row lock contention等待事件,这个是数据库里面一个比较常见的等待事件.enq是enqueue的缩写,它是一种保护共享资源的锁定机制,一个排队机制,先进先出(FIFO).enq: TX - row lock contention等待事件,OACLE将其归类为application级别的等待事件.有些场景是因为应用逻辑设计不合理造成的.下面我们看看enq: TX - row lock contention的英文介绍: This wait indicates ti

ORACLE AWR结合ASH诊断分析enq: TX - row lock contention

公司用户反馈一系统在14:00~15:00(2016-08-16)这个时间段反应比较慢,于是生成了这个时间段的AWR报告, 如上所示,通过Elapsed Time和DB Time对比分析,可以看出在这段时间内服务器并不繁忙.分析Top 5 Timed Events,我们可以看到前五的等待事件 可以看到等待事件enq: TX - row lock contention占了所有等待事件17.3%的比例,猜测有可能是锁等待(enqueue等待)引起的阻塞导致,但是这个还不能下定论,因为毕竟CPU Ti

enq: TX - row lock contention故障处理一则

一个非常easy的问题,之所以让我对这个问题进行总结.一是由于没我想象的简单,在处理的过程中遇到了一些磕磕碰碰,甚至绕了一些弯路.二是引发了我对故障处理时的一些思考. 6月19日,下午5点左右.数据库出现了大量的enq: TX - row lock contention等待事件,依照以往的经验,这类等待一般与业务逻辑有关.DBA可以做的事情.一般就是将锁等待着的连接信息,等待锁的SQL语句.甚至等待的详细数据行,还有就是锁持有者的连接信息,造成锁等待的SQL语句等一些基本信息提交给开发者,改动业

enq: TX - row lock contention 参数P1,P2,P3的讲解

enq: TX - row lock contention等待事件的三个参数如下 * P1 = name|mode          <<<<<<<<<<<<< name一般都为0x5458代表TX锁; mode为4代表共享锁 mode为6代表排他锁 * P2 = usn<<16 | slot      <<<<<<<<<<<<< v$tr

enq: TX - row lock contention 参数P1,P2,P3说明

enq: TX - row lock contention三个参数,例如,下面的等待事件 * P1 = name|mode          <<<<<<< name一般都为0x5458代表TX锁; mode为4代表共享锁 mode为6代表排他锁 * P2 = usn<<16 | slot      <<<<<<< v$transaction.xidusn  和 v$transaction.xidslot *

【转载】TX - row lock contention 的一些场景

TX - row lock contention 的一些场景 原创 2016-07-11 易欣 云和恩墨 易欣(Eson) 云和恩墨技术专家 本文整理来自7月7日周四晚云和恩墨大讲堂嘉宾易欣分享的主题:TX - row lock contention 的一些场景,供大家参考. 概述 在数据库运维过程中,enq: TX - row lock contention 是一个常见的等待事件,特别是 RAC 环境下.对于 enq: TX - row lock contention 等待事件,Oracle

解决enq: TX - index contention的常用方法

摘自: Troubleshooting 'enq: TX - index contention' Waits (Doc ID 873243.1) o  Rebuild the index  as reverse key indexes or hash partition the indexes which are listed in the 'Segments by Row Lock Waits' of the AWR reports o  Consider increasing the CAC

mysql优化案例

MySQL优化案例 Mysql5.1大表分区效率测试 Mysql5.1大表分区效率测试MySQL | add at 2009-03-27 12:29:31 by PConline | view:60, comment:0 mysql5.1开始支持数据表分区了,原来的分表可以不用了,分表的不足在于多表查询不方便.呵呵,下面来简单测试下表分区的查询效率. 1.用来测试的数据为discuz论坛的数据库,表为cdb_posts表,数据量为1500多万条mysql> select count(*) fro

清算/报表/日终跑批程序之性能优化案例(一)

前言 不知不觉,技术人生系列·我和数据中心的故事来到了第五期.小y又和大家见面了! 前几期主要发了一些TroubleShooting的案例分享,其实小y最擅长的是性能优化,所以从这期开始,小y会陆续的分享更多的数据库性能优化案例. 进入正题,如果您的日终跑批/清算/报表等程序时快时慢,或者从某一天以后就一直变慢,作为运维DBA或开发的您,会怎么下手?还有,除了解决问题外,你要如何解答领导最关心的一个问题,"为什么现在有问题,但是以前没有问题呢"! 小y今天要和大家分享的就是这样一个性能