服务器大量锁等待如何解决

服务器大量锁等待如何解决,第1张

前段时间遇到线上报大量的锁等待的错误

如下图

首先需要说明一下锁等待错误是怎么产生的.官方的错误编码表有这个的相关解释

工欲善其事必先利其器.你得有好的工具帮助到你.由于种种原因,线上的监控不是那么完备,导致报错解决起来比较困难.所以自己有几裤毁件趁手的工具就很重要了.这里便说一下我这次解决问题用到的.

1.查询锁等待的语句,

具体字段解释百度

2.本地开发环境配粗纯毕置显示执行sql

这样你可以看到一个接口执行了哪些sql方便你去快速查看原因

3.本地mysql服务端配置显示执行sql

可以参考这岩芹位大佬的配置

如何配置mysql 执行log

4.修改超时等待的值,就是 去设置 innodb_lock_wait_timeout这个变量的值,设置的短一点就会更容易复现.因为线上的是会产生大量事务的,而你本地服务器没有线上那种很忙的情况,可以压测本地的mysql,也可以通过设置更短的时间来快速报错.

5.本地最好把日志级别调低,方便看到更详细的错误

其实自己解决也花了不少时间,有些事情还是想的太过于深入最后发现对自己解决问题没什么用,应该也给自己设置一个思考超时时间和行动超时时间,比如都设置半个小时,如果没有任何进展要么去尝试其他的,要么去短暂的休息一下,说不定你会产生更好的思路.

解决办法:开始-运行-gpedit.msc

在用户配置那里双击管理模版-控制面板-显示

右此芦面有个密码保护屏幕保护程序,双击他,改成未配颂扒衫置,应用然后确定就可以了.

如果本来就是未配置,就先改成已禁用,应用野腔,再改回未配置,应用然后确定就可以了

根据我之前接触到的此类问题,大致可以分为以下几种原因:

1. 程序中非数据库交互 *** 作导致事务挂起

将接口调用或者文件 *** 作等这一类非数据库交互 *** 作嵌入在 SQL 事务代码之中,那么整个事务很有可能因此挂起(接口不通等待超时或是上传下载大附件)。

2. 事务中包含性能较差的查询 SQL

事嫌液山务中存在慢查询,导致同一个事务中的其他 DML 无芹中法及时释放占用的行锁,引起行锁等待。

3. 单个事务中包含大量 SQL

通常是由于在事务代码中加入 for 循环导致,虽然单个 SQL 运行很快,但是 SQL 数量一大,事务就会很慢。

4. 级联更新 SQL 执行时间较久

这类 SQL 容易让人产生错觉,例如:update A set ... where ...in (select B) 这类级联更新,不仅会占用 A 表上的行锁,也会占用 B 表上的行锁,当 SQL 执行较久时,很容易引起 B 表上的行锁等待埋枣。

5. 磁盘问题导致的事务挂起

极少出现的情形,比如存储突然离线,SQL 执行会卡在内核调用磁盘的步骤上,一直等待,事务无法提交。

综上可以看出,如果事务长时间未提交,且事务中包含了 DML *** 作,那么就有可能产生行锁等待,引起报错。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12267451.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存