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 Time和db file sequential read等待事件所占的比例要大。于是我就使用awrddrpt.sql生成了15号与16号同一时段的AWR对比报告。

如上所示,16号14:00-15:00的DB Time反而比15号的DB Time小,从Top 5 Timed Events来看, 15号没有enq: TX - row lock contention等待事件,那么很有可能是这个引起的,那么我接下来看看16号14:00-15:00时间段的AWR报告的Wait Events,如下所示,enq: TX - row lock contention的Total Waits Tims(s)为1022秒,Avg Waits(ms)为2848毫秒,说明锁等待(enqueue等待)还是蛮严重的。

那么我们去检查Segments by Row Lock Waits,看看是那些对象产生了等待事件““enq: TX - row lock contention”,如下所示,主要是表INV_NEXT_NO,以及索引IDX_INV_SRN_HD_N1

另外在bdump的trace文件中发现在14:30左右出现了TNS-12535 & TNS-1260错误,那么我就来生成14:25:00~14:35:00这个时间段的ASH报告来分析一下

Client Address = (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.xxx.xxx)(PORT=44913))
*** 2016-08-16 14:32:36.012

  NS Primary Error: TNS-12535: TNS:operation timed out

  NS Secondary Error: TNS-12606: TNS: Application timeout occurred

kmduicxd: 0x7f381c4bc770, kmduiflg: 1, circuit: 0x3778688f0

  (circuit) dispatcher process id = (0x37f799ef8, 1)

            parent process id = (17, 1)

            serial # = 416

            connection context = 0x7f381c4bc770

            user session = ((nil)), flag = (100c0), queue = (9)

            current buffer = (0), status = (4, 0)

Client Address = (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.xxx.xx)(PORT=60069))

*** 2016-08-16 14:32:58.679

  NS Primary Error: TNS-12535: TNS:operation timed out

  NS Secondary Error: TNS-12606: TNS: Application timeout occurred

kmduicxd: 0x7f381c4bd960, kmduiflg: 1, circuit: 0x377942fd0

  (circuit) dispatcher process id = (0x37f799ef8, 1)

            parent process id = (17, 1)

            serial # = 798

            connection context = 0x7f381c4bd960

            user session = ((nil)), flag = (100c0), queue = (9)

            current buffer = (0), status = (4, 0)

可以看出主要是因为下面语句造成的

SELECT NEXT_NO FROM INV_NEXT_NO WHERE PREFIX_CODE = :B1 FOR UPDATE
 

select next_no from inv_next_no where prefix_code = ‘SRN-YMG-201608-‘ for update

想必你一看到FOR UPDATE语句,心里就已经知道了七七八八了,当两个会话或多个会话同时更新某一行时,就会出现enq: TX - row lock contention等待事件,如果其中一个会话迟迟不提交事务或是由于网络等其其它故障出现,那么其它会话就会一直等待这个资源,并发高的情况下,就会出现大量阻塞。这个还真是因为不合理的设计所造成的。因为系统要生成唯一并且连续的单号(前缀+数字),为了获取唯一并且连续的单号,所以使用SELECT FOR UPDATE这种设计来实现,没有使用SEQUENCE(因为SEQUENCE可能会跳号,造成单号不连续),也不能使用其它方式了。如果能修改生成单号的业务逻辑,这个问题就好解决了。

时间: 2024-08-27 06:32:01

ORACLE AWR结合ASH诊断分析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] 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

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

[转]oracle awr报告生成和分析

转自:http://blog.csdn.net/cuker919/article/details/8767328 最近由于数据库cpu占用非常高,导致VCS常常自动切换,引起很多问题. 最近学习一下数据库awr分析数据库sql执行性能的分析报告.下面将初步讲解一下: 1.先登陆数据库,生成awr报告. linux:~ # su - oracle[email protected]:~> sqlplus '/as sysdba' SQL*Plus: Release 11.1.0.6.0 - Prod

ORACLE AWR 和 ASH

一.关于ASH 我们都知道,用户在 ORACLE 数据库中执行操作时,必然要创建相应的连接和会话, 其中,所有当前的会话信息都保存在动态性能视图 V$SESSION 中,通过该视图,DBA 可 以查看用户实际执行的操作,或者当前的等待事件等.通常这部分信息是调优过程中的关键 信息,不过,一旦连接断开.会话信息就会被同时从V$SESSION及其它相关视图中清除, 也就是说,用户执行完操作走人,而你(DBA),如果不能在当前逮到他,过了这点,就不知 道它曾经做过什么了. 10g 版本中,ORACLE

(转载)Oracle AWR报告指标全解析

Oracle AWR报告指标全解析 2014-10-16 14:48:04 分类: Oracle [性能调优]Oracle AWR报告指标全解析 2013/08/31 BY MACLEAN LIU 26条评论 [性能调优]Oracle AWR报告指标全解析 开Oracle调优鹰眼,深入理解AWR性能报告:http://www.askmaclean.com/archives/awr-hawk-eyes-training.html 开Oracle调优鹰眼,深入理解AWR性能报告 第二讲: http: