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

一个很简单的问题,之所以让我对这个问题进行总结,一是因为没我想象的简单,在处理的过程中遇到了一些磕磕碰碰,甚至绕了一些弯路,二是引发了我对故障处理时的一些思考。 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
修复:Microsoft Teams 错误代码 80090016 您的计算机的受信任平台模块出现故障修复:Microsoft Teams 错误代码 80090016 您的计算机的受信任平台模块出现故障Apr 19, 2023 pm 09:28 PM

<p>MSTeams是与队友和同事交流、聊天或通话的值得信赖的平台。MSTeams上的错误代码为80090016以及<strong>您的计算机的受信任的平台模块出现故障</strong>的消息可能会导致登录困难。在错误代码得到解决之前,该应用将不允许您登录。如果您在打开MS团队或任何其他Microsoft应用程序时遇到此类消息,那么本文可以指导您解决问题。</p><h2&

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

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

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

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

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

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

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

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

win10共享打印机0x0000011b故障该怎么办win10共享打印机0x0000011b故障解决方案win10共享打印机0x0000011b故障该怎么办win10共享打印机0x0000011b故障解决方案Jul 18, 2023 am 08:33 AM

共享打印机的客户们在升级了2021年9月的补丁后发觉自己的win10计算机没法与共享打印机开展联接,那麼碰到了win10共享打印机0x0000011b故障怎么办呢,这个问题是较为多客户碰到的状况,下边就给各位给予win10共享打印机0x0000011b故障解决方案的具体内容,方式非常简单,客户们一看就可以学好。win10共享打印机0x0000011b故障该怎么办1、开启操作面板,进到程序流程和作用,查询已组装升级;2、卸载下列补丁:KB5005569/KB5005573/KB5005568/KB

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

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

怎样解决笔记本的麦克风无声问题怎样解决笔记本的麦克风无声问题Jan 04, 2024 pm 07:50 PM

最近很多使用笔记本的小伙伴表示麦克风没声音了该怎么办,其实这个大多数都是驱动问题导致的,一般更新一下就可以了,下面一起来看看具体的解决方法吧。笔记本麦克风没声音解决方法1、首先,我们需要找到麦克风设置的地方,我们先右击电脑左下角的声音符号;弹出的界面,我们点击声音;2、弹出的界面,我们点击扬声器;3、然后我们点击属性;4、弹出的界面,我们点击级别,然后将声音的音量调节到适当的位置,之后点击确定;5、然后我们在点击录制;6、弹出的界面,我们点击麦克风,然后点击属性;7、弹出的界面,我们点击级别,然

See all articles

热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.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
4 周前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

禅工作室 13.0.1

禅工作室 13.0.1

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

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器