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

MYSQL为什么会发生死锁,怎么解决

把死锁想成“两个人同时堵在一条窄巷的两头,谁也过不去”——他们手里各自攥着对方需要的钥匙,又不肯先把自己的钥匙交出来,于是永远僵持。


1️⃣ 窄巷模型(业务场景)

  • 窄巷 = 订单表
  • 两个人 = 两个并发事务 A、B
  • 钥匙 = next-key 锁(记录锁 + 间隙锁)

2️⃣ 死锁四步漫画

时间事务 A(想插 1007)事务 B(想插 1008)
SELECT ... FOR UPDATE 1007 不存在,于是给 (1006, +∞] 贴上“禁止新座位”封条(next-key 锁)
同样去 SELECT ... FOR UPDATE 1008 也不存在,也想给 (1006, +∞] 贴封条 → 发现已经被 A 贴过,只能排队等
现在真的插入 1007,需要再往 (1006, +∞] 里放一把“插入意向锁”的小钥匙 → 发现 B 正拿着同区间封条,也排队等

→ 互相等对方先放封条 → 循环等待 → 死锁!


3️⃣ 一句话总结

“两把锁同区间,先查后插互等待,就像两人堵巷口,谁都过不去。”


4️⃣ 怎么拆死锁

  • 设置超时:巷子口立个倒计时牌(innodb_lock_wait_timeout),到点把一个人请出去。
  • 死锁检测:保安巡逻发现循环,直接拉走其中一人(innodb_deadlock_detect = on)。
  • 业务预防:把 order_no 设成唯一索引,用“唯一冲突”代替“先查后插”,巷子直接修成单行道,根本不会出现两把钥匙。
http://www.dtcms.com/a/340876.html

相关文章:

  • 第三阶段数据-3:数据库脚本生成,备份与还原,分离与附加
  • configtx通道配置文件
  • RHCA08内存管理
  • 对称加密算法
  • 数据库DML语言(增、删、改)
  • 闪电赋能全链路:领码SPARK一体化创新平台
  • 基于HTTP3的WebTransport实践
  • 基于 Java 和 MySQL 的精品课程网站
  • 在完全没有无线网络(Wi-Fi)和移动网络(蜂窝数据)的环境下,使用安卓平板,通过USB数据线(而不是Wi-Fi)来控制电脑(版本2)
  • Ubuntu 重连usb设备(断电和不断电方案)亲测可行
  • 亚马逊新品爆单策略:从传统困境到智能突破
  • LeetCode热题100--101. 对称二叉树--简单
  • C++ 力扣 438.找到字符串中所有字母异位词 题解 优选算法 滑动窗口 每日一题
  • 《数据之舞》
  • GitHub宕机生存指南:从应急协作到高可用架构设计
  • QT-图像灰度处理时QImage.setPixel方法存在的坑
  • 在QT中动态生成控件造成界面卡顿时的鼠标处理
  • Qt设置软件使用期限【新版防修改系统时间】
  • 一个 WPF 文档和工具窗口布局容器
  • GitHub宕机应急指南:无缝协作方案
  • Eclipse 里Mybatis的xml的头部报错
  • 软考高级--系统架构设计师--案例分析真题解析
  • Java项目基本流程(五)
  • DeepSeek API 申请与 Node.js 对接指南
  • 服务器硬件电路设计之 SPI 问答(一):解密 SPI—— 从定义到核心特性
  • 服务器硬件电路设计之 SPI 问答(三):SPI 信号完整性守护与时钟频率的硬件设计羁绊
  • PCL+Spigot服务器+python进行MC编程2(使用RCON)---可以生成角色
  • 图论Day6学习心得
  • 源码编译部署 LAMP 架构详细步骤说明
  • 算法第五十二天:图论part03(第十一章)