当前位置: 首页 > news >正文

排查生产环境:MySQLTransactionRollbackException数据库死锁

一. 问题现状

程序直接宕机,并在error.log日志中发现大量的报错日志,如下:

### Error updating database.  
Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: 
Lock wait timeout exceeded; try restarting transaction
### The error may exist in com/xxx/dao/mapper/xxxMapper.java (best guess)
### The error may involve com.xxx.dao.mapper.xxxMapper.update-Inline
### SQL: UPDATE xxx_table SET a1=?, a2=?, a3=?, a4=?, a5=?  WHERE (q1= ?)

程序中使用的是mybatis-plus,报错信息准确提示出了对应的mapper文件以及对应的sql操作是updateById语句。再结合其他日志信息,初步判断出了对应的位置以及症结可能与事务操作有关。

二. 可能原因
事务过程中执行其他非数据库操作,导致事务长期未被处理
事务未被正常处理
网段导致应用端请求未被正常发送给数据库,数据库等待应用后续操作
应用服务器性能问题,CPU爆满等导致应用无法及时切换到该进程进行处理
根据以上原因,首先排查服务器情况发现不存在cpu爆满的情况,后续继续追究MySQL事务方面的问题。
从MySQL入手,执行以下语句查看锁情况:

-- 查看正在锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; 
-- 查看等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

(由于笔者的线上环境执行了重启,所以这会儿已经看不到具体结果了,实际上应该能看到对应等待锁的事务)
但是可以模拟线上情况,比如在代码中的@Transaction代码中打个debug断点,然后观察情况:

-- 查看执行进程
SHOW PROCESSLIST;
-- 执行查询未提交事务语句
SELECT * from  information_schema.INNODB_TRX;

基本可以确定问题出现在代码层。

三. 排查代码

生产伪代码如下:

@Transactional(rollbackFor = Exception.class)
public synchronized boolean doSomething(Object o){// ...if(flag){aMapper.updateById(o);}// ...bMapper.insert(o);return true;}

这里的目的是做一个事务,aMapper需要根据某个条件判断更新操作,bMapper则需要根据业务流程做新增操作,同时为了考虑并发情况下的操作所以在方法名上加了synchronized 同步锁。咋一看感觉没什么问题,但是在service层的方法上同时使用事务和锁无法保证同步。

原理是:@Transactional是使用了Sping AOP 实现的;Synchronized只是锁当前代码块,当执行完Synchronized包含的代码块就已经执行完了;此时@Transactional还未提交,所以就造成上一个事务没有提交,而下一个请求过来了争夺数据库的事务锁,在大量请求的情况下,有可能会承受不住。

针对这种情况,我们得保证让Synchronized的锁范围比@Transactional作用范围大,于是可以做如下改造:
 

public synchronized boolean doSomething(Object o){return transactionDoSomething(o)
}@Transactional(rollbackFor = Exception.class)
public boolean transactionDoSomething(Object o){// ...if(flag){aMapper.updateById(o);}// ...bMapper.insert(o);
}

另外一种方案:


@Transactional(rollbackFor = Exception.class)
public boolean transactionDoSomething(Object o){synchronized(this){// doSomethingreturn true;}
}

三. 扩展(ReentrantLock/druid自动重连数据库)
3.1 根因分析
经过以上处理,实际上应该不会再出现数据库死锁的情况了,但是经过日志的进一步查看发现没有将@Transaction与synchronized一起使用的地方也出现过死锁情况,在此处仅仅使用了synchronized同步锁,唯一与以上情况相似的就是同样使用了updateById。
 

public synchronized void doSomething(Object o){// ...xxxMapper.updateById(o);
}

剩下就是还有一种可能,网络波动、防火墙或是其他原因,导致了应用和mysql的连接断开,这个时候进入到这个代码块的执行逻辑在使用已经失败的连接,又由于这是加了synchronized的同步代码块,第一个进来的请求一直在等待连接导致后续进来的请求全都被堵塞。

3.2 改造synchronized使用ReentrantLock
于是我们在此处尽量引入一种比较友好的锁,ReentrantLock。
ReentrantLock的tryLock方法支持配置最大同步等待时间,由此来避免以上堵塞情况,写法如下:
 

@Service
public class LockService{// 初始化ReentrantLockprivate final Lock reentrantLock = new ReentrantLock();// 设置最大锁等待时间private final long tryLockTime = 2L;public void addRound(Long manMachineId,LocalDateTime time) {try {if (reentrantLock.tryLock(tryLockTime, TimeUnit.SECONDS)) {System.out.println("获取到锁,开始做一些事...");}else {System.out.println("等待2s后获取锁失败");}} catch (InterruptedException e) {e.printStackTrace();} finally {// 最终需要释放锁reentrantLock.unlock();}}
}

3.3 加入druid自动重连数据库

程序中使用了druid,所以我们加入以下配置信息即可实现在数据库停止的时候等待数据库恢复并自动重连,配置如下:

# 标记当Statement或连接被泄露时是否打印程序的stack traces日志
spring.datasource.druid.log-abandoned=true
# 是否自动回收超时连接
spring.datasource.druid.remove-abandoned=true
# 超时时间(以秒数为单位)
spring.datasource.druid.remove-abandoned-timeout=10

四. 总结
至此,本次MySQL线上死锁问题就已结束排查。
由于线上问题一般都比较复杂或者比较难复现,所以排查线上问题首先需要分析日志,这个时候就要求我们程序的日志要尽可能做到完善。
然后就是大胆猜测,小心验证,其中不免会经历多次推到重来的历程。此后该问题再次出现就不会再成为你的问题。
 

相关文章:

排查生产环境:MySQLTransactionRollbackException数据库死锁

一. 问题现状 程序直接宕机,并在error.log日志中发现大量的报错日志,如下: ### Error updating database. Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting trans…...

140.【鸿蒙OS开发-01】

鸿蒙开发 (一)、初识鸿蒙1.初识鸿蒙(1).移动通讯技术的发展(2).完整的鸿蒙开发 (二)、鸿蒙系统介绍1.鸿蒙系统的官方定义(1).鸿蒙操作系统概述(2).鸿蒙的生态 2.鸿蒙系统的特点3.鸿蒙和安卓的对比4.鸿蒙开发的发展前景 (三)、鸿蒙开发准备工作1.鸿蒙OS的完整开发流程2.注册并实…...

npm install 下载不下来依赖解决方案

背景 最近在构建 前端自动化部署 的方案中发现了一个问题,就是我在npm install的时候,有时候成功,有时候不成功,而且什么代码也没发生更改,报错也就是那么几个错,所以在此也整理了一下遇到这种情况&#xf…...

接口自动化中cookies的处理技术

一,理论知识 为什么有cookie和session? 因为http协议是一种无状态的协议,即每次服务端接受到客户端的请求时都时一个全新的请求,服务器并不知道客户端的请求记录,session和cookie主要目的就是弥补http的无状态特性 …...

PHP 安装

您需要做什么? 为了开始使用 PHP,您可以: 找一个支持 PHP 和 MySQL 的 Web 主机在您自己的 PC 机上安装 Web 服务器,然后安装 PHP 和 MySQL 使用支持 PHP 的 Web 主机 如果您的服务器支持 PHP,那么您不需要做任何事情…...

小程序常见操作

测试时访问本地http服务器调用报错 微信开发者工具(右上角)-> 详情->本地设置->不校验合法域名、web-view(业务域名)... -> 去除勾选使用npm包 1) 工程目录下创建package.jsonnpm init(手动完成设定) / npm init -y (默认设定) 2) 安装 np…...

STM32F4串口USART发送为00的解决方案

检查接线是否正确检查TX是否为复用推挽输出 3.检查是否将TX和RX引脚重映射为USART功能 在STM32中,每个GPIO引脚可以配置为不同的复用功能,例如UART、SPI、I2C等。具体来说,GPIO_PinAFConfig函数用于配置GPIO引脚的复用功能。它的参数包括GPIO…...

重磅解读 | 阿里云 云网络领域关键技术创新

云布道师 10 月 31 日,杭州云栖大会,阿里云技术主论坛带来了一场关于阿里云主力产品与技术创新的深度解读,阿里云网络产品线负责人祝顺民带来《云智创新,网络随行》的主题发言,针对阿里云飞天洛神云网络(下…...

【蓝桥杯省赛真题45】Scratch九宫格游戏 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解

目录 scratch九宫格游戏 一、题目要求 编程实现 二、案例分析 1、角色分析...

物联网AI MicroPython学习之语法 ADC数模模块

学物联网,来万物简单IoT物联网!! ADC 介绍 模块功能: ADC数模转换模块 ADC功能在ESP32引脚32-39上可用,使用默认配置时,ADC引脚上的输入电压必须介于0.0v和1.0v之间(任何高于1.0v的值都将读为4095&#x…...

详解Python中哈希表的使用。站在开发者角度,与大家一起探究哈希的世界。

文章目录 1. 前言2. 哈希表2.1 哈希函数2.2 哈希算法2.3 常见哈希算法2.4 哈希冲突 3.总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面…...

详解python淘宝秒杀抢购脚本程序实现

文章目录 前言一、官网下载火狐浏览器二、下载geckodriver,并解压到火狐浏览器文件夹根目录三、添加火狐浏览器根目录到系统环境变量四、下载并安装python及pycharm开发工具五、进入淘宝六、使用Pycharm运行脚本,新建python文件,将代码复制到…...

使用ChatGPT创建Makefile构建系统:使用Make运行Docker

使用ChatGPT创建Makefile构建系统:使用Make运行Docker 芯语芯愿(知乎/纷传/CSDN/);小石头的芯语芯愿(微信公众号) 开发高效现代的构建系统对于满足开发周期需求至关重要。原先,嵌入式开发者一…...

算法设计与分析复习--分支界限法

文章目录 上一篇分支界限法性质装载问题0-1背包问题单源最短路问题最大团问题下一篇 上一篇 算法设计与分析复习–回溯法(二) 分支界限法性质 分支界限法是按广度优先策略或最小耗费优先遍历问题的解空间树。 搜索解空间: 子集树排列树 …...

Https攻击怎么防御

随着互联网技术的发展,网站所遭受的网络攻击频率也在不断上升。某种程度上,我们可以说互联网上的每个网站都容易遭受安全攻击。因为网络攻击者最主要的动机是求财。无论你运营的是电子商务项目还是简单的小型商业网站,潜在攻击的风险就在那里…...

网络知识学习(笔记二)

ios模型规定的网络模型一共有7层,但是实际使用过程中,4层的TCP/IP模型是经常使用的,网络知识学习笔记里面也是基于4层TCP/IP模型进行分析的,前面已经讲了:(1)物理层,(2&a…...

万字解析设计模式之组合模式、亨元模式

一、组合模式 1.1概述 组合模式是一种结构型设计模式,它允许将对象组合成树形结构,以表示“部分-整体”的层次结构。组合模式使得客户端可以一致地对待单个对象和对象组合,从而将复杂的层次结构展现为一个统一的树形结构。 在组合模式中&…...

HTTP之常见问答

1:HTTP/1.1 如何优化? :尽量避免发送 HTTP 请求;通过缓存技术,使用请求的 Etag 参数来处理判断缓存过期等问题,类似304状态码就是告诉客户端,缓存有效还能继续使用 :在需要发送 HTTP…...

java伪共享问题

参考文章 https://blog.csdn.net/qq_45443475/article/details/131417090 产生原因 cpu 与内核数据交换的单位是 cache 行,多核 cpu 的高速缓存在对同一个变量进行修改时由于缓存一致性协议导致对应的缓存失效。 缓存行的大小 cpu 架构有关系,如果是 …...

【Ubuntu】Ubuntu arm64 部署 Blazor Server 应用

部署步骤 发布安装运行环境:dotnet-sdk(必装)、aspnetcore-runtime、dotnet-runtime安装证书设置环境变量:临时变量、当前用户永久变量、所有用户的永久变量运行:终端运行、后台运行 基本情况 开发系统环境 系统&am…...

基于RAG与本地大模型的智能文档管理:从原理到实践部署

1. 项目概述:当GPT遇上无纸化办公如果你和我一样,每天都要和一堆PDF、Word文档、扫描件打交道,那你肯定对“无纸化办公”这个词又爱又恨。爱的是它理论上能让我们摆脱堆积如山的文件,恨的是现实往往是——文件是电子化了&#xff…...

AI原生安全平台OpenClaw-Security:LLM驱动的智能安全运营实战

1. 项目概述:当AI遇上安全,一场关于“智能抓手”的深度探索最近在安全圈和AI开发者社区里,一个名为zast-ai/openclaw-security的项目引起了我的注意。这个名字本身就很有意思——“OpenClaw”,直译过来是“开放的爪子”或“智能抓…...

彻底告别开机烦恼:TranslucentTB任务栏透明工具自启动完全指南

彻底告别开机烦恼:TranslucentTB任务栏透明工具自启动完全指南 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB TranslucentTB…...

GEEKOM MiniAir 11迷你主机评测:Jasper Lake平台的多面手

1. GEEKOM MiniAir 11迷你主机深度评测:Jasper Lake平台的全能选手作为一名长期关注迷你PC市场的技术爱好者,最近我有机会对GEEKOM MiniAir 11进行了全面测试。这款搭载Intel Celeron N5095 Jasper Lake处理器的迷你主机给我留下了深刻印象——它不仅拥有…...

从噪音困扰到静音享受:Fan Control如何重塑你的Windows散热体验

从噪音困扰到静音享受:Fan Control如何重塑你的Windows散热体验 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Tr…...

PotPlayer字幕翻译插件终极指南:免费实现外语视频实时翻译

PotPlayer字幕翻译插件终极指南:免费实现外语视频实时翻译 【免费下载链接】PotPlayer_Subtitle_Translate_Baidu PotPlayer 字幕在线翻译插件 - 百度平台 项目地址: https://gitcode.com/gh_mirrors/po/PotPlayer_Subtitle_Translate_Baidu 还在为看不懂的外…...

新手入门指南:在快马平台用自然语言生成你的第一个信用卡切换页面

作为一个刚接触编程的新手,想要实现一个信用卡切换功能听起来可能有点复杂。不过最近我发现了一个特别适合新手的工具——InsCode(快马)平台,它让我不用写代码就能快速实现这个功能。下面分享一下我的学习过程。 理解需求 首先需要明确信用卡切换功能的核…...

5分钟掌握Switch游戏文件管理的完整解决方案

5分钟掌握Switch游戏文件管理的完整解决方案 【免费下载链接】NSC_BUILDER Nintendo Switch Cleaner and Builder. A batchfile, python and html script based in hacbuild and Nuts python libraries. Designed initially to erase titlerights encryption from nsp files an…...

“00后”冠军吴宜泽背后:父母关店卖房带儿子求学十年

吴宜泽的台球俱乐部已正式开业,运气好还能偶遇他在此训练,今后前往兰州,一定要到这你有没有想过,在兰州这座黄河穿城而过的城市里,推开一扇门就能看到世界冠军正在你眼前练球? 2025年8月23日,当…...

SITS2026 AISMM评估通关密钥:1张决策矩阵图+6个动态裁剪规则+1套证据链构建SOP

更多请点击: https://intelliparadigm.com 第一章:SITS2026深度解析:AISMM评估方法论 AISMM(Artificial Intelligence System Maturity Model)是SITS2026标准中核心的AI系统成熟度评估框架,旨在量化组织在…...