首页 数据库 mysql教程 enq:TX-rowlockcontention故障处理一则

enq:TX-rowlockcontention故障处理一则

Jun 07, 2016 pm 03:57 PM
处理 故障

一个很简单的问题,之所以让我对这个问题进行总结,一是因为没我想象的简单,在处理的过程中遇到了一些磕磕碰碰,甚至绕了一些弯路,二是引发了我对故障处理时的一些思考。 6月19日,下午5点左右,数据库出现了大量的enq: TX - row lock contention等待事件,

一个很简单的问题,之所以让我对这个问题进行总结,一是因为没我想象的简单,在处理的过程中遇到了一些磕磕碰碰,甚至绕了一些弯路,二是引发了我对故障处理时的一些思考。
6月19日,下午5点左右,数据库出现了大量的enq: TX - row lock contention等待事件,按照以往的经验,这类等待一般与业务逻辑有关,DBA能够做的事情,一般就是将锁等待着的连接信息,等待锁的SQL语句,甚至等待的具体数据行,还有就是锁持有者的连接信息,造成锁等待的SQL语句等一些基本信息提交给开发人员,修改业务逻辑。
注意 很多情况下,修改业务逻辑不是一时半会能够立即解决的事,有时候如果锁持有或者锁等待业务不是特别重要,可以与应用维护人员协商,先停掉这部分业务,让其它业务正常运行很多时候,数据库只有一个锁持有者,并且这个锁持有的连接也没有活动,可以与应用维护人员协商,尝试kill锁持有者,看看后续锁等待能否自动解决。这种情况一般是一个单独的连接出现僵死导致,kill掉持有者以后,问题自然就解决了另外一种情况就是,前天晚上上线后,平时运行好好的业务,也没出现锁等待,有一天出现了这类问题,而且kill掉锁持有者以后,问题无法得到解决(业务逻辑问题,kill掉以后,后续还会发生),这一般是前天晚上上线引起。 本来觉得数据库层提供信息很简单,结果与想象的有点区别,来看一下具体的过程 (1)查询锁信息,如下
SESS LMODE LMODE REQUEST TYPE EVENT SQL_TEXT
Holder: 4266 exclusive 6 0 TX SQL*Net message from client
Waiter: 3136 none 0 4 TX enq: TX - row lock contention insert into xxxxx(ID,xxx,xxxx,xxx,….) values(seq_xxx.nextval,:"SYS_B_0",:"SYS_B_1",:"SYS_B_2",:"SYS_B_3",:"SYS_B_4",:"SYS_B_5")
Holder: 2276 exclusive 6 0 TX SQL*Net message from client
Waiter: 1716 none 0 4 TX enq: TX - row lock contention insert into xxxxx(ID,xxx,xxxx,xxx,….) values(seq_xxx.nextval,:"SYS_B_0",:"SYS_B_1",:"SYS_B_2",:"SYS_B_3",:"SYS_B_4",:"SYS_B_5")
Holder: 1288 exclusive 6 0 TX SQL*Net message from client
Waiter: 1565 none 0 4 TX enq: TX - row lock contention insert into xxxxx(ID,xxx,xxxx,xxx,….) values(seq_xxx.nextval,:"SYS_B_0",:"SYS_B_1",:"SYS_B_2",:"SYS_B_3",:"SYS_B_4",:"SYS_B_5")
Holder: 1000 exclusive 6 0 TX SQL*Net message from client
Waiter: 1147 none 0 4 TX enq: TX - row lock contention insert into xxxxx(ID,xxx,xxxx,xxx,….) values(seq_xxx.nextval,:"SYS_B_0",:"SYS_B_1",:"SYS_B_2",:"SYS_B_3",:"SYS_B_4",:"SYS_B_5")
Holder: 2989 exclusive 6 0 TX SQL*Net message from client
Waiter: 862 none 0 4 TX enq: TX - row lock contention insert into xxxxx(ID,xxx,xxxx,xxx,….) values(seq_xxx.nextval,:"SYS_B_0",:"SYS_B_1",:"SYS_B_2",:"SYS_B_3",:"SYS_B_4",:"SYS_B_5")
备注:表名和列名做了模糊化 可以看到,锁等待语句正在等待Insert条记录 (2)通过查看锁持有者,已经执行的语句,来判断到底是那个语句造成了锁等待,查询语句如下: select b.sql_text ,a.* from v$open_cursor a,v$sql b where a.sql_id=b.sql_id and a.sid=4266 and upper(b.sql_text) like '%xxxxx%'; (3) 根据经验insert一条语句被阻塞,一般是由于主键约束引起(另一个连接也插入了同一条语句或者删除了一条语句,但是没有提交) 但是我通过上面的语句查询的时候,发现怎么也找不到锁持有者有执行过这个表的任何DML,而且询问开发人员,他们也说没有对这张表的DML操作 其中open_cursor为1000,v$open_cursor中的记录也远远没有达到这个数,才100条不到。session_cached_cursors设置为200,没有道理这个连接执行的语句游标已经被刷新出去 (4)还真没有遇到过类似的问题,怎么也找不到。这时我换了一个想法,抛开那些经验,我在想,是不是有一种可能不对Insert插入语句进行任何DML操作,也会造成一条插入语句被锁掉?? 我考虑了这张表的依赖对象是不是会造成种类等待,例如触发器、外键引用等等。 仔细考虑一番,发现触发器,审计什么的,数据库应该能定位到具体的语句,而不是发生在这个insert语句本身(就算是递归语句,Oracle也能捕获到才对),因此,最让我怀疑的就是外键引用,通过下面这个查询,判断是否这个表通过外键引用了其他对象,如下 select a.table_name, a.owner, a.constraint_name, a.constraint_type, a.r_owner, a.r_constraint_name,--被外键引用的约束名 b.table_name --被外键引用的表名 from dba_constraints a, dba_constraints b where a.constraint_type = 'R' and a.r_constraint_name = b.constraint_name and a.r_owner = b.owner and b.table_name = 'xxxxx' and b.owner=''; 查询发现,确实有一张表引用这个插入等待的表,这时,顿时感觉希望很大。 (5)通过一个简单的测试,我验证我的推测,如下 create table t3 (id number primary key,name varchar2(20),product_id number); create table t2 (id number primary key,name varchar2(20)); alter table t3 add constraint FK_PRODUCTSTAT_PRODUCTID foreign key (PRODUCT_id) references t2 (ID); SQL> insert into t2 values(1,'dh'); 1 row inserted SQL> insert into t2 values(2,'cc'); 1 row inserted SQL> insert into t2 values(3,'cc'); 1 row inserted SQL> commit; Commit complete session 1执行如下操作: SQL> select * from t2; ID NAME ---------- -------------------- 1 dh 2 cc 3 cc SQL> select * from t3; ID NAME PRODUCT_ID ---------- -------------------- ---------- --可以看到,这时t3表有任何记录 SQL> insert into t2 values(4,'cc'); --对父表执行一条插入 1 row inserted、 session2 t2表执行一条插入操作,如下 insert into t3 values(1,'tt',4); 令人惊喜的是,确实发生了锁等待,与我们遇到的锁等待类型一模一样。 (6)查询锁持有者,是否有对锁等待表的父表有进行DML操作,如下 select b.sql_text ,a.* from v$open_cursor a,v$sql b where a.sql_id=b.sql_id and a.sid=4266 and upper(b.sql_text) like '%xxxxx_ref%'; 检查结果与我们预期的一致,确实有很多对主表的插入操作! (7)基本我们已经确定是什么语句导致锁堵塞,将语句提交给开发人员,修改代码后,问题解决!
问题总结 其实这个问题本身不难,值得思考的是,为什么一个这么简单的问题,无法立即找到原因。说到底,很多时候都是经验束缚了我们,在遇到这类问题时,我们需要抛开已有的那些经验,通过数据库的原理来发现根本原因。因此,理论知识再怎么强调都不过分,它真的很重要,理解了原理,你才可以举一反三,游刃有余,而不是每次一碰到没见过的问题都战战兢兢!
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

WIN10服务主机太占cpu的处理操作过程 WIN10服务主机太占cpu的处理操作过程 Mar 27, 2024 pm 02:41 PM

1、首先我们右击任务栏空白处,选择【任务管理器】选项,或者右击开始徽标,然后再选择【任务管理器】选项。2、在打开的任务管理器界面,我们点击最右端的【服务】选项卡。3、在打开的【服务】选项卡,点击下方的【打开服务】选项。4、在打开的【服务】窗口,右击【InternetConnectionSharing(ICS)】服务,然后选择【属性】选项。5、在打开的属性窗口,将【打开方式】修改为【禁用】,点击【应用】后点击【确定】。6、点击开始徽标,然后点击关机按钮,选择【重启】,完成电脑重启就行了。

发生0x0000004e错误代表了什么问题 发生0x0000004e错误代表了什么问题 Feb 18, 2024 pm 01:54 PM

0x0000004e是什么故障在计算机系统中,故障是一个常见的问题。当计算机遇到故障时,系统通常会因为无法正常运行而出现停机、崩溃或者出现错误提示。而在Windows系统中,有一个特定的故障代码0x0000004e,这是一个蓝屏错误代码,表示系统遇到了一个严重的错误。0x0000004e蓝屏错误是由于系统内核或驱动程序问题导致的。这种错误通常会导致计算机系统

黑鲨手机无法开机怎么办?教你自救方法! 黑鲨手机无法开机怎么办?教你自救方法! Mar 23, 2024 pm 04:06 PM

黑鲨手机无法开机怎么办?教你自救方法!在我们日常生活中,手机已经成为我们不可或缺的一部分。而对于很多人来说,黑鲨手机是一款备受喜爱的游戏手机。但是难免会遇到各种问题,其中之一就是手机无法开机。当你遇到这样的情况时,不要慌张,下面将为你介绍一些解决方法,希望能帮助到你。首先,当黑鲨手机无法开机时,首先要检查手机是否有足够的电量。可能是由于电量耗尽导致无法开机,

CSV文件操作速成指南 CSV文件操作速成指南 Dec 26, 2023 pm 02:23 PM

快速学会打开和处理CSV格式文件的方法指南随着数据分析和处理的不断发展,CSV格式成为了广泛使用的文件格式之一。CSV文件是一种简单且易于阅读的文本文件,其以逗号分隔不同的数据字段。无论是在学术研究、商业分析还是数据处理方面,都经常会遇到需要打开和处理CSV文件的情况。下面的指南将向您介绍如何快速学会打开和处理CSV格式文件。步骤一:了解CSV文件格式首先,

如何解决0x00000001蓝屏错误 如何解决0x00000001蓝屏错误 Feb 19, 2024 pm 11:12 PM

0x00000001蓝屏怎么办蓝屏问题是许多电脑用户经常遇到的一个令人头疼的问题。当我们的电脑遇到蓝屏时,它会突然停止运行,并显示一个带有错误代码的蓝屏界面。其中,0x00000001是一种常见的蓝屏错误代码。蓝屏问题可能由多种原因引起,包括软件错误、硬件故障、驱动程序问题等。尽管这个问题可能令人沮丧,但我们可以采取一些措施来解决它。下面我将介绍一些解决蓝屏

学习PHP中如何处理特殊字符转换单引号 学习PHP中如何处理特殊字符转换单引号 Mar 27, 2024 pm 12:39 PM

在PHP开发过程中,处理特殊字符是一个常见的问题,尤其是在字符串处理中经常会遇到特殊字符转义的情况。其中,将特殊字符转换单引号是一个比较常见的需求,因为在PHP中,单引号是一种常用的字符串包裹方式。在本文中,我们将介绍如何在PHP中处理特殊字符转换单引号,并提供具体的代码示例。在PHP中,特殊字符包括但不限于单引号(')、双引号(")、反斜杠()等。在字符串

黑鲨手机充电故障排查与解决 黑鲨手机充电故障排查与解决 Mar 22, 2024 pm 09:03 PM

黑鲨手机是一款以性能强悍、游戏体验出色而著称的智能手机品牌,备受广大游戏玩家和科技爱好者的喜爱。然而,就像其他智能手机一样,黑鲨手机也会出现各种问题,其中充电故障是比较常见的一种。充电故障不仅会影响手机的正常使用,还可能引发更严重的问题,因此及时解决充电问题十分重要。本文将从常见的黑鲨手机充电故障原因入手,介绍排查和解决充电问题的方法,希望能帮助读者解决黑鲨

显卡风扇停转的原因及解决办法 显卡风扇停转的原因及解决办法 Dec 26, 2023 pm 05:49 PM

很多小伙伴刚买了新的显卡,装上了才没几天,风扇突然就不转了,这是什么原因呢?这是正常的吗?这肯定是问题的,你可以查看机箱内的显卡,内存和硬盘线连接好没有供电是否正常,有没电压不稳的情况,具体的原因下面跟小编一起来看看吧,显卡风扇不转的原因解答1.供电不足这是导致风扇不转最普遍的原因之一,当你的电源所提供的能量达不到显卡的要求之时,为了保持电脑程序的正常运转,绝大部分显卡会将自己的散热风扇停掉,以保证GPU核心能够继续进行运算,遇到这种情况的时候就不要怪罪人家显卡不给力了啦!明明已经很贴心了好不好

See all articles