Mysql 死锁场景及解决方案

embedded/2025/3/1 0:57:57/

一、常见死锁场景

1. 不同顺序的锁获取
  • 场景:事务A按顺序更新 行1 → 行2,事务B按 行2 → 行1 顺序更新。

  • 原因:双方各持有一把锁,同时请求对方持有的锁,形成循环等待。

2. 索引缺失导致锁升级
  • 场景:更新操作未命中索引,导致全表扫描,锁住所有记录(甚至间隙锁)。

  • 原因:无索引时,行锁可能升级为表锁,增大死锁概率。

3. 间隙锁(Gap Lock)冲突
  • 场景:在可重复读(RR)隔离级别下,事务A删除某范围数据,事务B尝试插入相同范围的数据。

  • 原因:间隙锁阻塞插入操作,导致互相等待。

4. 唯一键冲突
  • 场景:高并发下插入相同唯一键数据,事务A和事务B同时尝试插入,触发唯一约束冲突。

  • 原因:回滚时释放锁的顺序可能引发死锁。

5. 混合操作(SELECT ... FOR UPDATE + UPDATE)
  • 场景:事务A先 SELECT ... FOR UPDATE 锁定行1,再更新行2;事务B反向操作。

  • 原因:显式锁与隐式锁交叉请求。


二、解决方案

1. 统一锁顺序
  • 操作:确保所有事务按相同顺序访问资源(如统一按主键升序更新)。

  • 示例:事务A和事务B均按 行1 → 行2 顺序更新。

2. 优化索引设计
  • 操作:为高频查询/更新字段添加索引,避免全表扫描。

  • 示例:对 WHERE 或 UPDATE 条件字段建立索引,缩小锁范围。

3. 降低事务粒度
  • 操作:减少事务内操作,尽快提交释放锁。

  • 示例:避免在事务中执行耗时操作(如外部API调用)。

4. 设置合理隔离级别
  • 操作:使用 READ COMMITTED 替代 REPEATABLE READ,减少间隙锁的使用。

  • 注意:需权衡一致性与并发性能。

5. 重试机制
  • 操作:捕获死锁异常(错误码 1213),等待随机时间后重试事务。

  • 代码示例(伪代码)

    python

    复制

    try:execute_transaction()
    except DeadlockError:wait(random_time)retry()
6. 避免长事务
  • 操作:监控并拆分执行时间过长的事务,减少锁持有时间。

  • 工具:通过 SHOW PROCESSLIST 或 INFORMATION_SCHEMA.INNODB_TRX 监控事务。

7. 使用乐观锁
  • 操作:通过版本号或时间戳实现无锁更新。

  • 示例

    UPDATE table SET col = new_val, version = version + 1 
    WHERE id = 1 AND version = old_version;
8. 分析死锁日志
  • 操作:通过 SHOW ENGINE INNODB STATUS 查看死锁日志,定位冲突SQL。

  • 关键信息:关注 LATEST DETECTED DEADLOCK 部分,分析锁类型(行锁、间隙锁)和事务操作路径。


三、案例分析

案例1:不同顺序更新导致的死锁
  • 事务A

    BEGIN;
    UPDATE users SET score = 100 WHERE id = 1;
    UPDATE users SET score = 200 WHERE id = 2;
    COMMIT;
  • 事务B

    BEGIN;
    UPDATE users SET score = 300 WHERE id = 2;
    UPDATE users SET score = 400 WHERE id = 1;
    COMMIT;
  • 解决:统一按主键升序更新(先更新 id=1 再 id=2)。

案例2:唯一键插入死锁
  • 场景:两个事务同时插入相同唯一键数据。

  • 解决:使用 INSERT ... ON DUPLICATE KEY UPDATE 或先检查后插入(需捕获异常)。


四、总结

场景解决策略
不同顺序锁竞争统一资源访问顺序
无索引导致锁升级优化索引设计
间隙锁冲突降低隔离级别或避免范围操作
长事务阻塞拆分事务,快速提交
高并发写入冲突乐观锁或重试机制

通过合理设计事务、优化索引、分析日志及结合重试机制,可有效减少死锁发生概率。

更加详细案例参考:

Mysql死锁场景案例及解决方案-CSDN博客


http://www.ppmy.cn/embedded/168921.html

相关文章

List的模拟实现(2)

前言 上一节我们讲解了list的基本功能,那么本节我们就结合底层代码来分析list是怎么实现的,那么废话不多说,我们正式进入今天的学习:) List的底层结构 我们先来看一下list的底层基本结构: 这里比较奇怪的…

AndroidStudio下载旧版本方法

首先,打开Android Studio的官网:https://developer.android.com/studio。 然后,点击【Read release notes】。 然后需要将语言切换成英文,否则会刷不出来。 然后就可以看下各个历史版本了。 直接点链接好像也行:h…

YOLOv8+QT搭建目标检测项目

2024年7月YOLOv8QT初步搭建目标检测(避坑)_qt yolov8-CSDN博客YOLOv8QT初步搭建目标检测 2024年7月YOLOv8QT初步搭建目标检测(避坑)_qt yolov8-CSDN博客 yolov8的可视化界面(一、可视化界面设计)_yolo 可…

‌KNN算法优化实战分享——基于空间数据结构的工业级实战指南

‌作者:‌ 某大厂空间计算架构师 ‌发布日期:2025年02月27日‌ ‌适用场景:地理信息系统(GIS)、自动驾驶、物流调度等海量空间数据查询‌ ‌一、生产环境代码模板‌ 1.1 KD-Tree批量化构建与查询(千万级数…

3分钟idea接入deepseek

DeepSeek简介 DeepSeek 是杭州深度求索人工智能基础技术研究有限公司开发的一系列大语言模型,背后是知名量化资管巨头幻方量化3。它专注于开发先进的大语言模型和相关技术,拥有多个版本的模型,如 DeepSeek-LLM、DeepSeek-V2、DeepSeek-V3 等&…

BS架构网络安全 网络安全架构分析

🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 文章目录 Web架构安全分析 一、web工作机制 1. 简述用户访问一个网站的完整路径2. web系统结构 二、url 1. 概述2. 完整格式3. url编码 三、HTTP 1. reque…

Claude 3.7 Sonnet 泄露,Anthropic 最先进 AI 模型即将在 AWS Bedrock 上首次亮相

(图片:AWS) Anthropic 旗下先进的 AI 模型 Claude 3.7 Sonnet 似乎即将发布。业界预计,亚马逊可能会在2025年2月26日的活动中公布相关消息。泄露的信息表明,该模型将托管于 AWS Bedrock 平台,该平台以提供尖端 AI 模型访问而闻名…

【JavaWeb学习Day19】

Tlias智能学习系统(员工管理) 删除员工: 需求分析: 其实,删除单条数据也是一种特殊的批量删除,所以,删除员工的功能,我们只需要开发一个接口就行了。 三层架构: Cont…