记一则update 发生enq: TX - row lock contention 的处理方法
根据事后在虚拟机中复现客户现场发生的情况,做一次记录(简化部分过程,原理不变)
客户端1执行update语句
SQL> select * from test;
ID NAME
---------- --------------------------------
2 b
10 c
1 b
SQL> update test set id = 3 where name = 'c';
1 row updated.
客户端2执行另外一条update语句
SQL> update test set id = 4 where name = 'c';
这个时候第二条update卡住了,证明发生了hanganalyze,查询当前的等待事件
SQL> select vw.sid,v.serial#, vw.event, vw.p1raw, vw.p2, v.username, sql_id from v$session_wait vw, v$session v where vw.sid = v.sid and vw.event not like '%message%' order by 3 desc;
SID SERIAL# EVENT P1RAW P2 USERNAME SQL_ID
---------- ---------- -------------------------------------------------- ---------------- ---------- --------------- -------------
13 1 smon timer 000000000000012C 0
2 1 pmon timer 000000000000012C 0
40 7 i/o slave wait 0000000091605340 0
42 23 i/o slave wait 0000000091605340 0
36 23 enq: TX - row lock contention 0000000054580006 196608 ELAN 53msja8m8hbcw
4 1 VKTM Logical Idle Wait 00 0
31 3 Streams AQ: waiting for time management or cleanup 00 0
tasks
18 15 Streams AQ: qmn slave idle wait 0000000000000001 0
25 9 Streams AQ: qmn coordinator idle wait 00 0
33 43 Space Manager: slave idle wait 00 0
8 1 DIAG idle wait 0000000000000005 1
6 1 DIAG idle wait 0000000000000005 1
12 rows selected.
可以看到等待事件中有tx锁
进而查找彼此发生的依赖关系,是谁堵塞了谁
SELECT DECODE(request,0,'Holder: ','Waiter: ')||sid sess, id1, id2, lmode, request, type FROM V$LOCK WHERE (id1, id2, type) IN(SELECT id1, id2, type FROM V$LOCK WHERE request>0) ORDER BY id1, request; SESS ID1 ID2 LMODE REQUEST TY
------------------------------------------------ ---------- ---------- ---------- ---------- --
Holder: 46 196608 786 6 0 TX
Waiter: 36 196608 786 0 6 TX
发现,持有者是46号sid,等待着是36号sid,并且lmode模式是6
在oracle官方的支持文档中可以看到对于该模式的描述 exclusive 独占(X):独立访问使用,exclusive,通常发生在Alter table, Drop table, Drop Index, Truncate table, Lock Exclusive

进而可以根据sid查找是那条语句发生了阻塞
SELECT /*+ ORDERED */ a.SQL_TEXT FROM v$sqltext a WHERE (a.hash_value, a.address) IN ( SELECT DECODE (sql_hash_value, 0, prev_hash_value, sql_hash_value ), DECODE (sql_hash_value, 0, prev_sql_addr, sql_address) FROM v$session b where b.SID = 46) order by a.PIECE SQL_TEXT
----------------------------------------------------------------
update test set id = 3 where name = 'c'
进而可以根据sid和serial反查是那个机器发出了这条指令
select sid,serial#,machine,CLIENT_INFO from v$session where sid =
2 ''; SID SERIAL# MACHINE CLIENT_INFO
---------- ---------- ---------------------------------------------------------------- ----------------------------------------------------------------
46 67 elan
基本就能够排查所出现情况,进而进行沟通解决,是不是语句未提交导致,或者是其他原因
等待持有锁的会话commit或者rollback。 通常为会话1在某行上执行 update/delete 未提交,会话2对同一行数据进行 update/delete,或其它原因(例如SQL性能差)造成的锁释放速度缓慢或网络问题,都会造成后续的会话进入队列等待
不着急查杀,这个还是要等待确认后,在进行下一步操作
接下里我们使用hanganalyze来分析上述问题
执行hanganalyze
SQL> ORADEBUG setmypid
Statement processed.
SQL> oradebug unlimit;
Statement processed.
SQL> oradebug hanganalyze 3
Hang Analysis in /u01/app/oracle/diag/rdbms/elan/elan/trace/elan_ora_6322.trc
SQL>
HANG ANALYSIS基本信息,摘录部分信息如下
-------------------------------------------------------------------------------
Chain 1:
-------------------------------------------------------------------------------
Oracle session identified by: --阻塞会话信息
{
instance: 1 (elan.elan)
os id: 6337
process id: 27, oracle@elan (TNS V1-V3)
session id: 36
session serial #: 23
}
is waiting for 'enq: TX - row lock contention' with wait info:
{
p1: 'name|mode'=0x54580006
p2: 'usn<<16 | slot'=0x30000
p3: 'sequence'=0x312
time in wait: 19 min 57 sec
timeout after: never
wait id: 24
blocking: 0 sessions --此处显示当前会话没有阻塞的session,说明是被阻塞会话
current sql: update test set id = 4 where name = 'c'
wait history:
* time between current wait and wait #1: 0.000966 sec
1. event: 'db file sequential read'
time waited: 0.000178 sec
wait id: 23 p1: 'file#'=0x5
p2: 'block#'=0x8a
time waited: 0.000040 sec
wait id: 22 p1: 'FileOperation'=0x2
p2: 'fileno'=0x5
p3: 'filetype'=0x2
* time between wait #2 and #3: 0.001004 sec
3. event: 'SQL*Net message from client'
time waited: 17.589536 sec
wait id: 21 p1: 'driver id'=0x62657100
p2: '#bytes'=0x1
}
and is blocked by
=> Oracle session identified by:
{
instance: 1 (elan.elan)
os id: 6336
process id: 25, oracle@elan (TNS V1-V3)
session id: 46 --会话session
session serial #: 67
}
which is waiting for 'SQL*Net message from client' with wait info:
{
p1: 'driver id'=0x62657100
p2: '#bytes'=0x1
time in wait: 20 min 21 sec
timeout after: never
wait id: 25
blocking: 1 session --此处显示被阻塞的会话数是1,也证明是锁会话持有者
current sql: <none>
short stack: ksedsts()+465<-ksdxfstk()+32<-ksdxcb()+1927<-sspuser()+112<-__sighandler()<-read()+14<-ntpfprd()+117<-nsbasic_brc()+376<-nsbrecv()+69<-nioqrc()+495<-opikndf2()+978<-opitsk()+831<-opiino()+969<-opiodr()+917<-opidrv()+570<-sou2o()+103<-opimai_real()+133<-ssthrdmain()+265<-main()+201<-__libc_start_main()+253
wait history:
* time between current wait and wait #1: 0.000003 sec
1. event: 'SQL*Net message to client'
time waited: 0.000001 sec
wait id: 24 p1: 'driver id'=0x62657100
p2: '#bytes'=0x1
* time between wait #1 and #2: 0.000069 sec
2. event: 'Disk file operations I/O'
time waited: 0.000040 sec
wait id: 23 p1: 'FileOperation'=0x2
p2: 'fileno'=0x3
p3: 'filetype'=0x2
* time between wait #2 and #3: 0.000287 sec
通过上述分析:大概可以得出sid=36因为请求enq: TX - row lock contention(TX mode=6)被sid=46阻塞
分析过程基本如上
记一则update 发生enq: TX - row lock contention 的处理方法的更多相关文章
- 解决一则enq: TX – row lock contention的性能故障
上周二早上,收到项目组的一封邮件: 早上联代以下时间点用户有反馈EDI导入"假死",我们跟踪了EDI导入服务,服务是正常在跑,可能是处理的慢所以用户感觉是"假死" ...
- ORACLE等待事件:enq: TX - row lock contention
enq: TX - row lock contention等待事件,这个是数据库里面一个比较常见的等待事件.enq是enqueue的缩写,它是一种保护共享资源的锁定机制,一个排队机制,先进先出(FIF ...
- Tuning “enq:TX – row lock contention” events
enq是一种保护共享资源的锁定机制,一个排队机制 排它机制从一个事务的第一次改变直到rollback or commit 结束这个事务, TX等待mode是6,当一个session 在一个表的行级锁定 ...
- 记录一则enq: TX - row lock contention的分析过程
故障描述:与客户沟通,初步确认故障范围大概是在上午的8:30-10:30之间,反应故障现象是Tomcat的连接数满导致应用无法连接,数据库alert中无明显报错,需要协助排查原因. 1.导入包含故障时 ...
- AWR之-enq TX - row lock contention的性能故障-转
1 对这一个小时进行AWR的收集和分析,首先,从报告头中看到DB Time达到近500分钟,(DB Time)/Elapsed=8,这个比值偏高: Snap Id Snap Time Sessio ...
- ORACLE AWR结合ASH诊断分析enq: TX - row lock contention
公司用户反馈一系统在14:00~15:00(2016-08-16)这个时间段反应比较慢,于是生成了这个时间段的AWR报告, 如上所示,通过Elapsed Time和DB Time对比分析,可以看出在这 ...
- 大表建立索引引发enq: TX - row lock contention等待
今天要给一张日志表(6000w数据)建立索引,导致生产系统行锁部分功能卡住 create index idx_tb_cid on tb_login_log(user_id); 开始执行后大概花费了20 ...
- [Oracle] enq: TX - row lock contention 优化案例
依据开发反馈.近期每天早上7:30应用会报警.应用的日志显示数据库连接池满了.新的连接被拒绝. 首先.我做了ASH报告(报告区间:7:25 ~ 7:35),从ASH的等待事件发现enq: TX - r ...
- enq: TX - row lock contention“等待事件的处理
enq: TX - row lock contention“等待事件的处理 session1: SQL> conn scott/triger Connected. SQL> CRE ...
随机推荐
- 乱花渐入迷人眼------从解决jqueryEasyUI上传插件提交ajax请求谈网页调试
由于要给格斗男神写搏击俱乐部ERP系统,就要用到jquery Easyui插件规范数据和表单的录入,其中一项功能就是上传商品图片, 而且是在datagrid-detailview中使用filebox完 ...
- js 计算字符串中出现次数最多的字符及其次数
方法一: var str="sdfseresssssdssdfsa"; var arr=[]; var max=0; var maxk; for(var i=0;i<str. ...
- JS实现 Tab栏切换案例
要求:当鼠标点击上面相应的选项卡(tab),下面页面的内容也随之而改变. 结构分析: 全部的内容都放到一个大的盒子里面,盒子里面又可以分为上面和下面两个盒子. 上面的盒子放了 5个li,装着5个小的选 ...
- 小米手机安装https证书报错:无法安装该证书 因为无法读取该证书文件
Fiddler]手机安装https证书报错:无法安装该证书 因为无法读取该证书文件 之前在手机上使用 “ip:端口号” 的方法就能直接在手机上自动下载安装fiddler证书,但是现在有些手机并不能 ...
- codevs 1231 最优布线问题 x(find函数要从娃娃抓起系列)
题目描述 Description 学校需要将n台计算机连接起来,不同的2台计算机之间的连接费用可能是不同的.为了节省费用,我们考虑采用间接数据传输结束,就是一 ...
- fiddler(三)、会话框添加显示请求方法栏
在使用fiddler抓包的时候,查看请求类型get和post每次只有点开该请求,在Inspectors才能查看get和post请求,不太方便.如果在会话框能直观地查看到请求方式,那就好了! 一.添加会 ...
- 转载:tcp详解
TCP详解 转自:http://www.cnblogs.com/kzloser/articles/2582957.html 首部格式 图释: 各个段位说明: 源端口和目的端口: 各占 2 字节.端口是 ...
- R_Studio(聚类)针对iris数据比较几种聚类方法优劣
聚类分析 百度百科:传送门 聚类分析指将物理或抽象对象的集合分组为由类似的对象组成的多个类的分析过程 聚类与分类的不同在于,聚类所要求划分的类是未知的 聚类分析是一种探索性的分析,在分类的过程中,人们 ...
- 「CQOI 2014」危桥
题目链接 戳我 \(Solution\) 首先往返\(n\)次等价于走\(2n\)次. 将 \(a_n*2,b_n*2\); 那么我们直接按原图构图,然后: \((S,a_1,a_n),(S,b_1, ...
- 2019秋Java学期课程总结
眨眼间,Java这门课程就快要到了尾声,这门课程主要学习到 搭建了Java的编译环境,安装eclipse软件,会用Java写一些简单的程序. 主要学习到的知识点有以下几点 1:通过写pta上的作业知道 ...