MySQL 死锁问题分析与解决方案

news2025/3/26 7:27:54

****


一、死锁原因分析

死锁通常由以下场景引发:

  1. 事务执行顺序不一致:多个事务以不同顺序访问相同资源。
  2. 索引缺失:全表扫描导致行锁升级为表锁。
  3. 长事务或大事务:长时间持有锁资源,增加冲突概率。
  4. 隔离级别设置:如 REPEATABLE READ 隔离级别下的间隙锁竞争。

二、诊断死锁
1. 查看死锁日志
SHOW ENGINE INNODB STATUS;  -- 获取最新死锁信息

重点关注 LATEST DETECTED DEADLOCK 段,分析涉及的事务、SQL 及锁信息。

2. 开启死锁监控(长期跟踪)
# my.cnf 配置
innodb_print_all_deadlocks = ON  -- 记录所有死锁到错误日志

三、解决死锁的常见方法
1. 优化事务逻辑
  • 固定资源访问顺序:确保所有事务按相同顺序操作表或行。

    -- 事务1和事务2均按顺序更新表A、表B
    BEGIN;
    UPDATE table_a SET ... WHERE id = 1;
    UPDATE table_b SET ... WHERE id = 2;
    COMMIT;
    
  • 缩短事务时间:避免在事务中执行耗时操作(如外部 API 调用)。

2. 索引优化
  • WHEREJOINORDER BY 条件字段添加索引,减少锁范围。
    -- 添加联合索引减少锁冲突
    ALTER TABLE orders ADD INDEX idx_user_product (user_id, product_id);
    
3. 降低锁粒度
  • 使用行锁代替表锁:确保操作通过索引定位数据。
  • 避免 SELECT ... FOR UPDATE 滥用:仅在必要时加锁。
4. 调整隔离级别
  • 使用 READ COMMITTED 隔离级别,减少间隙锁(Gap Lock)的使用:
    SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
    
5. 主动死锁检测与重试

在代码层捕获死锁错误(错误码 1213),自动重试事务:

# Python 示例(伪代码)
max_retries = 3
for attempt in range(max_retries):
    try:
        with connection.cursor() as cursor:
            cursor.execute("BEGIN")
            # 执行SQL操作
            cursor.execute("COMMIT")
        break
    except pymysql.err.OperationalError as e:
        if e.args[0] == 1213:  # 死锁错误码
            connection.rollback()
            time.sleep(0.1 * (2 ** attempt))  # 指数退避
        else:
            raise

四、预防死锁的最佳实践
  1. 事务设计原则

    • 保持事务简短,尽快提交或回滚。
    • 避免在事务中执行用户交互操作。
  2. 索引与查询优化

    • 定期分析慢查询日志,优化全表扫描语句。
    • 使用 EXPLAIN 检查 SQL 执行计划。
  3. 监控与告警

    • 通过 Prometheus + Grafana 监控死锁频率。
    • 配置报警规则(如每分钟死锁数超过阈值)。

五、案例分析
场景描述

两个并发事务引发死锁:

  • 事务1UPDATE table SET ... WHERE id = 1;UPDATE table SET ... WHERE id = 2;
  • 事务2UPDATE table SET ... WHERE id = 2;UPDATE table SET ... WHERE id = 1;
死锁日志解读
LATEST DETECTED DEADLOCK
...
*** (1) TRANSACTION:
TRANSACTION 12345, ACTIVE 0 sec updating
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 1136, 1 row lock(s)
MySQL thread id 100, OS thread handle 0x7f8a1c0d6700, query id 2000 updating
UPDATE table SET ... WHERE id = 1;

*** (1) HOLDS THE LOCK(S):
RECORD LOCKS space id 0 page no 10 n bits 80 index PRIMARY of table `test`.`table`
 trx id 12345 lock_mode X locks rec but not gap

*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 11 n bits 80 index PRIMARY of table `test`.`table`
 trx id 12345 lock_mode X locks rec but not gap

*** (2) TRANSACTION:
TRANSACTION 67890, ACTIVE 0 sec updating
mysql tables in use 1, locked 1
3 lock struct(s), heap size 1136, 2 row lock(s)
MySQL thread id 101, OS thread handle 0x7f8a1c0d6800, query id 2001 updating
UPDATE table SET ... WHERE id = 2;
...
解决方案
  • 统一更新顺序:所有事务按 id 升序更新。
  • 合并更新语句:使用单条 SQL 更新多行。
    UPDATE table SET ... WHERE id IN (1, 2) ORDER BY id ASC;
    

六、工具推荐
  1. pt-deadlock-logger(Percona Toolkit):

    pt-deadlock-logger --ask-pass --host=localhost --user=root
    

    实时监控死锁事件并记录到文件。

  2. 性能模式(Performance Schema)

    SELECT * FROM performance_schema.data_locks;  -- 查看当前锁状态
    

总结

解决 MySQL 死锁需结合 事务逻辑优化索引调整锁机制理解,核心原则是减少资源竞争。通过监控工具快速定位问题,并在代码层实现重试机制,可显著降低死锁对业务的影响。

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

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

相关文章

用 pytorch 从零开始创建大语言模型(六):对分类进行微调

用 pytorch 从零开始创建大语言模型(六):对分类进行微调 6 微调用于分类6.1 微调的不同类别6.2 准备数据集6.3 创建数据加载器6.4 使用预训练权重初始化模型6.5 添加分类头部6.6 计算分类损失和准确率6.7 在监督数据上微调模型6.8 使用LLM进…

Netty——BIO、NIO 与 Netty

文章目录 1. 介绍1.1 BIO1.1.1 概念1.1.2 工作原理1.1.3 优缺点 1.2 NIO1.2.1 概念1.2.2 工作原理1.2.3 优缺点 1.3 Netty1.3.1 概念1.3.2 工作原理1.3.3 优点 2. Netty 与 Java NIO 的区别2.1 抽象层次2.2 API 易用性2.3 性能优化2.4 功能扩展性2.5 线程模型2.6 适用场景 3. 总…

【Linux】信号:信号保存和处理

🔥个人主页:Quitecoder 🔥专栏:linux笔记仓 目录 01.阻塞信号信号集 02.捕捉信号sigaction可重入函数volatileSIGCHLD 01.阻塞信号 实际执行信号的处理动作称为信号递达:每个信号都有一个默认行为,例如终…

应用权限组列表

文章目录 使用须知位置相机麦克风通讯录日历运动数据身体传感器图片和视频音乐和音频跨应用关联设备发现和连接剪切板文件夹文件(deprecated) 使用须知 在申请目标权限前,建议开发者先阅读应用权限管控概述-权限组和子权限,了解相关概念,再合…

MATLAB实现基于“蚁群算法”的AMR路径规划

目录 1 问题描述 2 算法理论 3 求解步骤 4 运行结果 5 代码部分 1 问题描述 移动机器人路径规划是机器人学的一个重要研究领域。它要求机器人依据某个或某些优化原则 (如最小能量消耗,最短行走路线,最短行走时间等),在其工作空间中找到一…

【深度学习】多目标融合算法(五):定制门控网络CGC(Customized Gate Control)

目录 一、引言 二、CGC(Customized Gate Control,定制门控网络) 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 2.3.1 业务场景与建模 2.3.2 模型代码实现 2.3.3 模型训练与推理测试 2.3.4 打印模型结构 三、总结 一、引言 上一…

【NLP 42、实践 ⑪ 用Bert模型结构实现自回归语言模型的训练】

如果结局早已注定,那么过程就将大于结局 —— 25.3.18 自回归语言模型:由前文预测后文的语言模型 特点:单向 训练方式:利用前n个字预测第n1个字,实现一个mask矩阵,送入Bert模型,让其前文看不到…

TCP | 序列号和确认号 [逐包分析] | seq / ack 详解

注 : 本文为 “TCP 序号(seq)与确认序号(ack)” 相关文章合辑。 英文引文,机翻未校。 中文引文,略作重排。 如有内容异常,请看原文。 Understanding TCP Seq & Ack Numbers […

在Linux、Windows系统上安装开源InfluxDB——InfluxDB OSS v2并设置开机自启的保姆级图文教程

一、进入InfluxDB下载官网 InfluxData 文档https://docs.influxdata.com/Install InfluxDB OSS v2 | InfluxDB OSS v2 Documentation

考研复习之队列

循环队列 队列为满的条件 队列为满的条件需要特殊处理,因为当队列满时,队尾指针的下一个位置应该是队头指针。但是,我们不能直接比较 rear 1 和 front 是否相等,因为 rear 1 可能会超出数组索引的范围。因此,我们需…

智慧高速,安全护航:视频监控平台助力高速公路高效运营

随着我国高速公路里程的不断增长,交通安全和运营效率面临着前所未有的挑战。传统的监控方式已难以满足现代化高速公路管理的需求,而监控视频平台的出现,则为高速公路的安全运营提供了强有力的技术支撑。高速公路视频监控联网解决方案 高速公路…

Jboss漏洞再现

一、CVE-2015-7501 1、开环境 2、访问地址 / invoker/JMXInvokerServlet 出现了让下载的页面,说明有漏洞 3、下载ysoserial工具进行漏洞利用 4、在cmd运行 看到可以成功运行,接下来去base64编码我们反弹shell的命令 5、执行命令 java -jar ysoserial-…

【Linux系统】Linux权限讲解!!!超详细!!!

目录 Linux文件类型 区分方法 文件类型 Linux用户 用户创建与删除 用户之间的转换 su指令 普通用户->超级用户(root) 超级用户(root) ->普通用户 普通账户->普通账户 普通用户的权限提高 sudo指令 注: Linux权限 定义 权限操作 1、修改文…

2.创建Collection、添加索引、加载内存、预览和搜索数据

milvus官方文档 milvus2.3.1的官方文档地址: https://milvus.io/docs/v2.3.x 使用attu创建collection collection必须要有一个主键字段、向量字段 确保字段类型与索引类型兼容 字符串类型(VARCHAR)通常需要使用 Trie 索引,而不是 AutoInd…

AIGC 新势力:探秘海螺 AI 与蓝耘 MaaS 平台的协同创新之旅

探秘海螺AI:多模态架构下的认知智能新引擎 在人工智能持续进阶的进程中,海螺AI作为一款前沿的多功能AI工具,正凭借其独特的多模态架构崭露头角。它由上海稀宇科技有限公司(MiniMax)精心打造,依托自研的万亿…

一文解读DeepSeek在法律商业仲裁细分行业的应用

引言 当AI闯入法律界:DeepSeek如何把商业仲裁变成“纠纷快车道” AI技术正在像水电煤一样渗透生活,随着DeepSeek的爆火出圈,全国各行各业都在如火如荼地接入DeepSeek,以期望利用DeepSeek的“超能力”来重塑各自行业的效能和格局&a…

快速入手-基于Django的主子表间操作mysql(五)

1、如果该表中存在外键,结合实际业务情况,那可以这么写: 2、针对特殊的字典类型,可以这么定义 3、获取元组中的字典值和子表中的value值方法 4、对应的前端页面写法

HTTPS协议—加密算法和中间攻击人的博弈

活动发起人小虚竹 想对你说: 这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧&#xff01…

【大模型理论篇】CogVLM:多模态预训练语言模型

1. 模型背景 前两天我们在《Skywork R1V: Pioneering Multimodal Reasoning with Chain-of-Thought》中介绍了将ViT与推理模型结合构造多模态推理模型的案例,其中提到了VLM的应用。追溯起来就是两篇前期工作:Vision LLM以及CogVLM。 今天准备回顾一下Cog…

AI知识补全(一):tokens是什么?

名人说:苔花如米小,也学牡丹开。——袁枚《苔》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、什么是Tokens?二、为什么Tokens如此重要?1.模型的输入输出限制2.…