如下图
首先需要说明一下锁等待错误是怎么产生的.官方的错误编码表有这个的相关解释
工欲善其事必先利其器.你得有好的工具帮助到你.由于种种原因,线上的监控不是那么完备,导致报错解决起来比较困难.所以自己有几裤毁件趁手的工具就很重要了.这里便说一下我这次解决问题用到的.
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 *** 作,那么就有可能产生行锁等待,引起报错。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)