【总结】MySQL 更新数据超时失败-死锁排查解决

MySQL 更新数据超时失败

问题现象

今天操作线上数据时,想要更新一条数据,结果页面上转了很久,最终http请求超时报错。

查看了后端的应用日志,发现如下信息:

[2024-05-27 10:29:29.294] ERROR c.t.h.e.ExceptionHandlers line:129 -exception for system: 
org.springframework.dao.CannotAcquireLockException: 
### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
### The error may exist in class path resource [mapper/PackagePOMapper.xml]
### The error may involve cn.tongdun.hera.mapper.PackagePOMapper.updateByPrimaryKeySelective-Inline
### The error occurred while setting parameters
### SQL: update `package` SET tag = ?, package_type = ?, remark = ?, last_updated_by = ? where id = ?
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
; ]; Lock wait timeout exceeded; try restarting transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:263)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:88)

关键信息一眼就找到: Lock wait timeout exceeded; try restarting transaction

mysql 锁等待超时,是不是有事务还未提交事务就异常中断了?导致其他事务无法获取到修改的锁?

尝试了下新增,新增是没有问题的。

排查分析

使用具有权限的用户登录mysql,执行:show engine innodb status;

查看当前InnoDB 状态,拉到中间,发现返回的信息里有这么一段。

—TRANSACTION 61073962, ACTIVE 6591 sec
2 lock struct(s), heap size 8400, 59 row lock(s), undo log entries 6
MySQL thread id 51644855, OS thread handle 140342299920128, query id 775065555 192.168.10.135 ares
—TRANSACTION 61073883, ACTIVE 8953 sec
3 lock struct(s), heap size 3520, 59 row lock(s), undo log entries 33
MySQL thread id 51637360, OS thread handle 140341246162688, query id 774880224 192.168.10.135 ares
—TRANSACTION 61071129, ACTIVE 11974 sec
3 lock struct(s), heap size 3520, 59 row lock(s), undo log entries 22
MySQL thread id 51630799, OS thread handle 140342452467456, query id 774757507 192.168.10.135 ares

果然有3个事务,已经分别运行了6591 秒、8953秒、11974秒。

至于这三个事务为什么会长时间运行,感觉是业务代码写得不够严禁,并发操作回滚逻辑不严谨。

解决方法

1)查看事务详情,执行:SELECT * FROM INFORMATION_SCHEMA.innodb_trx ORDER BY trx_started;

2)找到需要杀掉的事务线程ID,具体就是查询记录中的 trx_mysql_thread_id 字段值,比如此处找到是555946。

3)执行 kill 555946; 杀死线程。

其他辅助方法:

查看锁情况:SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

查看锁等待情况:SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/16928.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【知识蒸馏】多任务模型 feature-based 知识蒸馏实战

一、实现流程 (1)定义学生和教师模型 (2)定义特征蒸馏损失 Mimic LossCWD LossMGD LossFeature Loss (3)使用hook获取需要蒸馏的特征层 定义回调函数使用hook函数获取需要蒸馏的挺特征层 (…

太狠了,凌晨5点面试。。

(关注数据结构和算法,了解更多新知识) 网上看到一网友发文说收到面试邀请,面试时间竟然是早晨5点,这是要猝死的节奏。有的网友说应该是下午 5 点,如果是下午 5 点直接写下午 5 点就行了,或者写 17 点也行,直…

[企业级高效系统工具]短视频矩阵系统 ,一站式管理新媒体账号,短视频精准获客,一键管理上千个短视频账。

一、做项目为什么要搭建一款属于自己的系统? 在讲这个短视频矩阵系统前,我们聊聊做项目的时候为什么要搭建一款属于自己的系统。 1.拥有自己的系统,就意味着你可以随时随地进行源码部署和更新。你的项目就能紧跟时代潮流,始终保持…

具身人工智能:人工智能机器人如何感知世界

什么是具身人工智能 虽然近年来机器人在智能城市、工厂和家庭中大量出现,但我们大部分时间都在与由传统手工算法控制的机器人互动。这些机器人的目标很狭隘,很少从周围环境中学习。相比之下,能够与物理环境互动并从中学习的人工智能 (AI) 代理(机器人、虚拟助手或其他智能系…

强化学习——学习笔记

一、什么是强化学习? 强化学习 (Reinforcement Learning, RL) 是一种通过与环境交互来学习决策策略的机器学习方法。它的核心思想是让智能体 (Agent) 在执行动作 (Action)、观察环境 (Environment) 反馈的状态 (State) 和奖励 (Reward) 的过程中,学习到…

【每日随笔】小人畏威不怀德 , 君子畏德不畏威 ( 先礼后兵 )

文章目录 一、小人畏威不怀德1、小人畏威不怀德2、小人场景一3、小人场景二 二、君子畏德不畏威三、先礼后兵 一、小人畏威不怀德 1、小人畏威不怀德 如果 友善 的对待 小人 , 这种人 认知低 且 素质差 , 小人 会将你的 " 友善 " 理解为 " 屈服 " , 他会认…

单片机方案开发个性定制

酷得智能是玩具企业合作方案商,致力于为玩具企业提供一站式的智能化解决方案。我们拥有丰富的行业经验和技术实力,能够根据客户的需求和市场趋势,为其量身定制最适合的智能玩具产品和解决方案。 主营业务: 东莞市酷得智能科技有限…

Sping源码(九)—— Bean的初始化(非懒加载)— ConversionService

序言 经过前面一系列的加载、解析等准备工作,此刻refresh方法的执行已经来到了尾声,接下来我们用几篇文章着重的介绍一下Bean的初始化 代码 着重看refresh()主流程中的finishBeanFactoryInitialization()方法。 finishBeanFactoryInitialization 方法…

JAVA开发 利用代码生成奖状

通过java实现用模板生成奖状 1、图片模板2、实现代码3、生成模板 1、图片模板 2、实现代码 import javax.imageio.ImageIO; import java.awt.*; import java.awt.font.TextAttribute; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException;…

CompositeDisposable作用

CompositeDisposable 是一个在 RxJava 中常用的类,它用于管理多个 Disposable 对象。Disposable 是 RxJava 中用于管理订阅(subscription)的接口,它允许我们取消订阅以避免内存泄漏和不必要的资源消耗。 CompositeDisposable 的主…

三坐标测量机在汽车零部件质量控制中的应用

高质量的零部件能够确保汽车的性能达到设计标准,包括动力性能、燃油效率、操控稳定性等,从而提供更好的驾驶体验,建立消费者对汽车品牌的信任;也推动了汽车行业的技术创新,制造商不断研发新材料、新工艺,以…

Java 登录错误次数限制,用户禁登1小时

手机号验证码登录,验证码输入错误次数超5次封禁 Overridepublic boolean checkCaptcha(String phoneNum, String captcha) {String codeNum (String) redisTemplate.opsForValue().get(UserCacheNames.USER_CAPTCHA phoneNum);if (codeNum null) {throw new Wan…

怎么图片转excel表格免费?介绍三个方法

怎么图片转excel表格免费?在日常工作中,我们经常需要将图片中的表格数据转化为可编辑的Excel格式。幸运的是,市面上有多款软件支持这一功能,并且部分软件还提供免费使用的选项。本文将为您详细介绍几款可以免费将图片转换为Excel表…

Java 异步编程——Java内置线程调度器(Executor 框架)

文章目录 Java多线程的两级调度模型Executor 框架Executor 框架的组成概念Executor 框架中任务执行的两个阶段:任务提交和任务执行 在 Java1.5 以前,开发者必须手动实现自己的线程池;从 Java1.5 开始,Java 内部提供了线程池。 在J…

Python代码:十九、列表的长度

1、题目 描述: 牛牛学会了使用list函数与split函数将输入的连续字符串封装成列表,你能够帮他使用len函数统计一些公输入了多少字符串,列表中有多少元素吗? 输入描述: 输入一行多个字符串,字符串之间通过…

基于Java+SpringBoot+Mybaties-plus+Vue+elememt + uniapp 驾校预约平台 的设计与实现

一.项目介绍 系统角色:管理员、教练、学员 小程序(仅限于学员注册、登录): 查看管理员发布的公告信息 查看管理员发布的驾校信息 查看所有教练信息、预约(需教练审核)、评论、收藏喜欢的教练 查看管理员发布的考试信息、预约考试(需管理…

流媒体内网穿透/组网/视频协议转换EasyNTS上云网关如何更改密码?

EasyNTS上云网关的主要作用是解决异地视频共享/组网/上云的需求,网页对域名进行添加映射时,添加成功后会生成一个外网访问地址,在浏览器中输入外网访问地址,即可查看内网应用。无需开放端口,EasyNTS上云网关平台会向Ea…

什么是逆向抓包?是通过什么进行操作的?怎么解决?

前言 逆向抓包是一个技术过程,它涉及使用特定的网络分析工具来捕获和分析网络通信中的数据包。这个过程的目的通常是研究和理解网络协议、应用程序或系统的内部工作原理。以下是关于逆向抓包的详细解释及操作方式: 什么是逆向抓包? 逆向抓…

【linux】深入了解线程池:基本概念与代码实例(C++)

文章目录 1. 前言1.1 概念1.2 应用场景1.3 线程池的种类1.4 线程池的通常组成 2. 代码示例2.1 log.hpp2.2 lockGuard.hpp① pthread_mutex_t 2.3 Task.hpp2.4 thread.hpp2.5 threadPool.hpp① 基本框架② 成员变量③ 构造函数④ 其余功能函数: main.cc结果演示 完整…

数组与指针声明小问题

1、int *p &a; 是 C 语言中的一条语句,它涉及指针的声明和初始化。让我们逐步解释这一行代码的含义: int *p:这是一个指针声明。它声明了一个名为 p 的变量,该变量是一个指向 int 类型数据的指针。 &a:这是取…