MySQLTransactionRollbackException

问题描述

mysql部署1主3从,昨天发现主库有大量报警错误:

Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
; Deadlock found when trying to get lock; try restarting transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction

定位根因

MySQLTransactionRollbackException是MySQL 处理并发事务时的典型错误。一般有死锁Deadlock和锁等待超时innodb_lock_wait_timeout两种;

当两个或多个事务相互等待对方持有的锁资源时,MySQL 会主动终止其中一个事务以打破僵局,从而抛出该异常,这一过程由 InnoDB 的死锁检测机制自动完成,无需人工干预。

分析死锁日志,定位冲突点:MySQL 会记录死锁详情到错误日志中,可通过以下命令查看最近一次死锁信息:

SHOW ENGINE INNODB STATUS;

在输出的 LATEST DETECTED DEADLOCK 部分,能看到:

  • 参与死锁的事务 ID 和 SQL 语句。
  • 事务持有和等待的锁类型(如 X-lock 排他锁)。
  • 涉及的表和行记录(通过 space id 和 page no 定位)。
    LATEST DETECTED DEADLOCK
    ------------------------
    2025-09-11 17:19:22 0x7ee2dbbdf700
    *** (1) TRANSACTION:
    TRANSACTION 922499728, ACTIVE 0 sec starting index read
    mysql tables in use 1, locked 1
    LOCK WAIT 2 lock struct(s), heap size 1136, 1 row lock(s)
    MySQL thread id 24349657, OS thread handle 139512913655552, query id 4391620199 10.199.99.99 kms_mpmanage_st_pjab updating
    /*id:3b7f6356*//*ip=10.199.99.99*/update srunningset report_time = 1757582355865,is_del = 0,graph_version = null,service_item = ‘aaaaa’,build_id = 9652,report_version = 2,config_version = 'config-202508112023',scene_sdk_version = '1.3.20',table_sdk_version = '2.4.31'where pid = 179529542 and report_time < 1757582355865
    *** (1) WAITING FOR THIS LOCK TO BE GRANTED:
    RECORD LOCKS space id 828 page no 8 n bits 200 index uniq_ip_app_scene_s of table `camp`.`srunning` trx id 922499728 lock_mode X locks rec but not gap waiting
    *** (2) TRANSACTION:
    TRANSACTION 922499723, ACTIVE 0 sec fetching rows
    mysql tables in use 1, locked 1
    27 lock struct(s), heap size 3520, 35 row lock(s), undo log entries 12
    MySQL thread id 24348682, OS thread handle 139512814368512, query id 4391620202 10.199.99.99 kms_mpmanage_st_pjab updating
    /*id:389d6f54*//*ip=10.199.99.99*/update srunningSET report_time = 1757582353855, is_del = 1 WHERE ( pid = 179529542 and report_time < 1757582353855 )
    *** (2) HOLDS THE LOCK(S):
    RECORD LOCKS space id 828 page no 8 n bits 200 index uniq_ip_app_scene_s of table `camp`.`srunning` trx id 922499723 lock_mode X locks rec but not gap
    *** (2) WAITING FOR THIS LOCK TO BE GRANTED:
    RECORD LOCKS space id 828 page no 8 n bits 200 index uniq_ip_app_scene_s of table `camp`.`srunning` trx id 922499723 lock_mode X waiting
    *** WE ROLL BACK TRANSACTION (1)

    两个update更新同一表死锁是两个事务在该表中以不同顺序获取行锁,形成循环等待。

    解决和避免

    业务涉及事务的4个表都达到了500W+,且事务内同时查询插入或更新4个表,所以多次死锁

    统一事务操作顺序

    多个事务更新同一批行时,按相反或不同的顺序执行 UPDATE,是单表死锁的最主要原因。

    降低锁粒度或使用合理的索引

    使用非主键索引、范围条件(><BETWEEN)等,导致 InnoDB 加锁范围扩大(如间隙锁、临键锁),增加交叉等待概率。

    缩小事务范围减少锁持有时间

    事务执行时间过长,长时间占用锁资源,提高了与其他事务形成循环等待的可能性。

    数据表量级对性能有显著影响

    • 小型表(10 万行以内)SELECT、INSERT、UPDATE基本无瓶颈,操作耗时主要受 SQL 语句写法影响
    • 中型表(10 万~1000 万行):SELECT无索引的全表扫描开始变慢,有索引但索引设计不合理(如低基数索引)时,性能下降明显,复杂查询(多表关联、子查询)耗时增加,可能出现临时表或文件排序。INSERT:单条插入影响不大,但批量插入可能因索引维护(如 B+ 树分裂)耗时增加。若表有多个索引,写入性能下降更明显(每个索引都需更新)。UPDATE:基于非索引字段的更新需要全表扫描,耗时显著增加。高频更新可能导致行锁 / 表锁竞争,出现等待延迟。
    • 大型表(1000 万~1 亿行):需要分库分表、数据归档等拆分

    代码层面捕获异常并重试

    死锁是临时性异常,重试通常可解决。在代码中捕获 MySQLTransactionRollbackException,并设置合理的重试机制

    锁类型

    • lock_type:锁类型,常见值:
      • RECORD:行级锁(针对具体行记录)。
      • TABLE:表级锁(针对整个表)。
    • lock_mode:锁模式,常见值:
      • S:共享锁(读锁,允许其他事务读,不允许写)。
      • X:排他锁(写锁,禁止其他事务读和写)。
      • GAP:间隙锁(锁定索引间隙,防止插入数据)。
      • Next-Key:临键锁(行锁 + 间隙锁的组合,默认的行锁模式)。

    行级排他锁,UPDATE/DELETE/INSERT 时自动加锁,阻止其他事务修改该行。

    行级共享锁,SELECT ... FOR SHARE 显式加锁,允许其他事务读,但阻止写。

    排他间隙锁,锁定索引间隙,防止其他事务插入数据(如 UPDATE ... WHERE id > 10 可能触发)。

    临键锁(默认行锁模式),锁定行及前面的间隙,防止幻读(REPEATABLE READ 隔离级别下默认)。

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

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

    相关文章

    Redis环境搭建指南:Windows/Linux/Docker多场景安装与配置

    Redis环境搭建指南&#xff1a;Windows/Linux/Docker多场景安装与配置 1. Redis安装方式概览 1.1 安装方式对比 安装方式适用场景优点缺点难度Windows直接安装开发调试安装简单&#xff0c;Windows兼容好性能不如Linux&#xff0c;生产不推荐⭐Linux源码编译生产环境性能最佳…

    leetcode.80删除有序数组中的重复项2

    题目描述 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。…

    运动卡新手入门及常见问题处理

    1.新手入门1.1 插卡打开包装&#xff0c;拿出PCI板卡&#xff0c;如下图&#xff1a;打开电脑机箱盖&#xff0c;找到PCI插槽&#xff0c;如下图&#xff08;红色框部分是PCI槽&#xff0c;有些主板上PCI槽是白色或其他颜色&#xff09;&#xff1a;插入板卡&#xff0c;如下图…

    PRINCE2与PMP项目管理体系对比

    在全球范围内&#xff0c;PRINCE2与PMP是两大最具影响力的项目管理体系。PRINCE2注重流程和治理结构&#xff0c;强调“控制”与“规范”&#xff1b;而PMP基于PMBOK指南&#xff0c;强调知识体系和方法论的全面性&#xff0c;更关注“工具”与“实践”。 不同体系的侧重点&…

    在UniApp跨平台开发中实现相机自定义滤镜的链式处理架构

    以下是进阶方案&#xff1a;架构核心设计分层结构$$Pipeline Capture \otimes Filter_1 \otimes Filter_2 \otimes \cdots \otimes Filter_n \otimes Render$$ 其中&#xff1a;$\otimes$ 表示链式处理操作符$Capture$ 为原始图像采集层$Filter_n$ 为可插拔滤镜单元$Render$ 为…

    Mark5 穿越机电调深度解析:设计、选型、控制与实战(下)

    TIM_SetCompare3 (TIM1, T0 + T1 + T2); // W+​ break;​ case 3:​ // U - 导通,V - 导通,W + 导通​ TIM_SetCompare1 (TIM1, T0); // U-​ TIM_SetCompare2 (TIM1, T0); // V-​ TIM_SetCompare3 (TIM1, T0 + T1 + T2); // W+​ break;​ case 4:​ // U - 导通…

    背包问题从入门到入土

    我在这里介绍4种常见的背包问题&#xff0c;这里我想按易 --> 难程度从01背包&#xff0c;完全背包&#xff0c;分组背包&#xff0c;多重背包的顺序介绍。&#xff08;封面附在最后&#xff09;一&#xff0c;01背包问题&#xff08;后面三个背包问题的基础&#xff09;01背…

    Leetcode 18 java

    ​​​​​1​​​​​​​141. 环形链表1 题目 ​​​​​1​​​​​​​141. 环形链表 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表…

    Linux 正则表达式详解(基础 + 扩展 + 实操)

    Linux 正则表达式详解&#xff08;基础 扩展 实操&#xff09; 正则表达式&#xff08;Regular Expression&#xff0c;简称 RE&#xff09;是 Linux 文本处理的核心工具&#xff0c;用于定义字符匹配模式&#xff0c;配合 grep、sed、awk 等工具可实现文本过滤、查找、替换等…

    Json-rpc通信项目(基于C++ Jsoncpp muduo库)

    一、介绍RPC RPC&#xff08;Remote Procedure Call&#xff09;远程过程调用&#xff0c;一种通过网络从远程计算器上请求服务&#xff0c;而不需要了解底层网络通信细节&#xff0c;RPC可以使用多种网络协议进行通信&#xff0c;并且在TCP/IP网络四层模型中跨越了传输层和应…

    RL【9】:Policy Gradient

    系列文章目录 Fundamental Tools RL【1】&#xff1a;Basic Concepts RL【2】&#xff1a;Bellman Equation RL【3】&#xff1a;Bellman Optimality Equation Algorithm RL【4】&#xff1a;Value Iteration and Policy Iteration RL【5】&#xff1a;Monte Carlo Learnin…

    Redis是什么?一篇讲透它的定位、特点与应用场景

    Redis是什么&#xff1f;一篇讲透它的定位、特点与应用场景 1. Redis的定义与核心概念 1.1 什么是Redis&#xff1f; Redis&#xff08;Remote Dictionary Server&#xff09; 是一个开源的、基于内存的数据结构存储系统&#xff0c;可以用作数据库、缓存和消息代理。Redis由…

    一款免费开源轻量的漏洞情报系统 | 漏洞情报包含:组件漏洞 + 软件漏洞 + 系统漏洞

    工具介绍 bug_search一款免费开源轻量的漏洞情报系统 基于python3 Amis2.9 开发&#xff0c;仅依赖Flask,requests&#xff0c;无需数据库&#xff0c;Amis是百度开源的低代码前端框架漏洞情报包含&#xff1a;组件漏洞 软件漏洞 系统漏洞 增加邮件发送消息报警功能增加钉钉…

    详解在Windows系统中生成ssl证书,实现nginx配置https的方法

    目录一、下载安装OpenSSL二、证书生成三、修改nginx配置总结Nginx 是一个高性能的HTTP和反向代理web服务器&#xff0c;在进行web项目开发时&#xff0c;大多都是使用nginx对外提供web服务。HTTPS &#xff08;全称&#xff1a;Hypertext Transfer Protocol Secure [5]&#xf…

    AI视觉算法中的OpenCV API (二)

    视频写入 (FourCC, VideoWriter)​ 1. VideoWriter_fourcc - 视频编码器四字符代码 # OpenCV 3.x, 4.x fourcc cv2.VideoWriter_fourcc(M,J,P,G)fourcc cv2.VideoWriter_fourcc(*H264)fourcc cv2.VideoWriter_fourcc(*MJPG) ​FourCC​&#xff1a; 代表 ​Four ​Charac…

    分享| 2025年版AIGC数字人实验室解决方案教学资源解析

    AIGC数字人实验室解决方案构建了涵盖基础层、平台环境层与资源层的多层次教学架构&#xff0c;依托150平方米的实体空间与60人并行授课的规模化支持&#xff0c;为学生提供了技术实践与创新的高效平台。其教学资源体系覆盖AIGC文本生成、图像生成、数字人应用与智能体开发四大核…

    内存大(巨)页

    一、大&#xff08;巨&#xff09;页 大&#xff08;巨&#xff09;页&#xff0c;很好理解&#xff0c;就是的大的页。说这个大页前&#xff0c;得先把计算机中内存的管理简单说明一下&#xff0c;否则可能对于一些新手或者把操作系统中内存管理的方法的开发者不太友好。最早的…

    langgraph astream使用详解

    langgraph中graph的astream&#xff08;stream&#xff09;方法分别实现异步&#xff08;同步&#xff09;流式应答&#xff0c;在langgraph-api服务也是核心方法&#xff0c;实现与前端的对接&#xff0c;必须要把这个方法弄明白。该方法中最重要的参数是stream_mode&#xff…

    【C++】模板进阶:非类型参数、模板特化与分离编译

    目录 1. 非类型模板参数 2. 模板的特化 3. 分离编译 1. 非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 非类型形参&#xff0c;就是用一个常量作为类(函数)模板…

    栈-1047.删除字符串中的所有相邻重复项-力扣(LeetCode)

    一、题目解析 1、反复执行重复项删除操作 2、s仅由小写英文字母组成 二、算法原理 该题并不难&#xff0c;难的是能不能想到用栈这个数据结构解题 解法&#xff1a;栈模拟 横着看起来不好理解&#xff0c;我们把它竖起来&#xff0c;是不是和消消乐很类似&#xff0c;两两消…