【MySQL】mysql死锁以及死锁日志分析
在数据库实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《【MySQL】mysql死锁以及死锁日志分析》,聊聊MySQL,希望可以帮助到正在努力赚钱的你。
1.死锁的概念
死锁:死锁一般是事务相互等待对方资源,最后形成环路造成的。
对于死锁,数据库处理方法:牺牲一个连接,保证另外一个连接成功执行。
发生死锁会返回ERROR:1213 错误提示,大部分的死锁InnoDB存储引擎本身可以侦测到,不需要人为进行干预。
注意:
InnoDB存储引擎并不会回滚大部分的错误异常,像阻塞章节里面的例子,但是死锁例外,发现死锁后,InnoDB存储引擎会马上回滚一个事务,会返回1213错误。
2.死锁的情形举例:
eg1:
步 骤 | 事务1 | 事务2 |
---|---|---|
1 | begin; | begin; |
2 | delete from info_area where id=1; | 空 |
3 | 空 | update info_users set mobile='18514656666' where mobile='18514656620'; |
4 | update info_users set mobile='18514656666' where mobile='18514656620'; | 空 |
5 | 空 | delete from info_area where id=1; |


分析死锁日志:
第一部分
从日志里我们可以看到事务1当前正在执行update info_users set mobile='18514656666' where mobile='18514656620',该条语句正在申请表info_users的索引IDX_MOBILE的X锁,所以提示lock_mode X waiting
第二部分:
然后日志的下半部分说明了事务2当前‘持有的锁’以及‘等待的锁’:
从日志的HOLDS THE LOCKS(S)块中我们可以看到事务2持有索引IDX_MOBILE的X锁,并且是记录锁(Record Lock)。该锁是通过事务2在步骤2执行的update语句申请的。
从日志的WAITING FOR THIS LOCK TO BE GRANTED块中我们可以看到事务2正在申请持有表info_area的索引GEN_CLUST_INDEX的X锁,该锁是delete from info_area where id=1;语句申请的。
eg2:
步骤 | 事务1 | 事务2 | |
---|---|---|---|
1 | begin; | begin; | |
2 | update info_users set name=’aaa’ where id=1; | 空 | |
3 | 空 | update info_users set name='bbb' where id=2; | |
4 | update info_users set name='bbb' where id=2; | 空 | |
5 | update info_users set name=’aaa’ where id=1; |
eg3:
步骤 | 事务1 | 事务2 |
---|---|---|
1 | begin; | begin; |
2 | DELETE from users where uid='bbb';执行成功 | |
3 | DELETE from users where uid='bbb';等待 | 空 |
4 | ERROR 1213 (40001) | insert INTO users VALUES(2,'bbb'); 成功 |


分析死锁日志:
第一部分
从日志里我们可以看到事务1当前正在执行DELETE from users where uid='bbb';,该条语句正在申请索引UID的X锁,所以提示lock_mode X waiting
第二部分:
然后日志的下半部分说明了事务2当前‘持有的锁’以及‘等待的锁’:
从日志的HOLDS THE LOCKS(S)块中我们可以看到事务2持有索引UID的X锁,并且是记录锁(Record Lock)。该锁是通过事务2在步骤2执行的delete语句申请的。
从日志的WAITING FOR THIS LOCK TO BE GRANTED块中我们可以看到事务2正在申请持有索引UID的S锁,该锁是insert INTO users VALUES(2,'bbb');语句申请的。insert语句在普通情况下是会申请X锁,但是这里出现了S锁。这是因为uid字段是一个唯一索引,所以insert语句会在插入前进行一次duplicate key的检查,为了使这次检查成功,需要申请S锁防止其他事务对uid字段进行修改。
那么为什么该S锁会失败呢?这是对同一个字段的锁的申请是需要排队的。S锁前面还有一个未申请成功的X锁,所以S锁必须等待,所以形成了循环等待,死锁出现了。
通过阅读死锁日志,我们可以清楚地知道两个事务形成了怎样的循环等待,再加以分析,就可以逆向推断出循环等待的成因,也就是死锁形成的原因。
好了,本文到此结束,带大家了解了《【MySQL】mysql死锁以及死锁日志分析》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多数据库知识!

- 上一篇
- Mysql 避免重复记录解决方案

- 下一篇
- sql 语句的执行顺序
-
- 数据库 · MySQL | 52分钟前 | MySQL建表 数据库建表
- MySQL建表命令详解与新表创建指南
- 499浏览 收藏
-
- 数据库 · MySQL | 3小时前 | mysql 解码 性能优化 FROM_BASE64 AES_DECRYPT
- MySQL中decode函数使用详解
- 361浏览 收藏
-
- 数据库 · MySQL | 15小时前 |
- MySQL主键详解:定义及作用
- 434浏览 收藏
-
- 数据库 · MySQL | 1天前 | mysql 字符集 中文乱码 utf8mb4 utf8mb4_unicode_ci
- MySQL中文乱码解决方案与字符集修改命令
- 286浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 谱乐AI
- 谱乐AI是由青岛艾夫斯科技有限公司开发的AI音乐生成工具,采用Suno和Udio模型,支持多种音乐风格的创作。访问https://yourmusic.fun/,体验智能作曲与编曲,个性化定制音乐,提升创作效率。
- 6次使用
-
- Vozo AI
- 探索Vozo AI,一款功能强大的在线AI视频换脸工具,支持跨性别、年龄和肤色换脸,适用于广告本地化、电影制作和创意内容创作,提升您的视频制作效率和效果。
- 6次使用
-
- AIGAZOU-AI图像生成
- AIGAZOU是一款先进的免费AI图像生成工具,无需登录即可使用,支持中文提示词,生成高清图像。适用于设计、内容创作、商业和艺术领域,提供自动提示词、专家模式等多种功能。
- 6次使用
-
- Raphael AI
- 探索Raphael AI,一款由Flux.1 Dev支持的免费AI图像生成器,无需登录即可无限生成高质量图像。支持多种风格,快速生成,保护隐私,适用于艺术创作、商业设计等多种场景。
- 6次使用
-
- Canva可画AI生图
- Canva可画AI生图利用先进AI技术,根据用户输入的文字描述生成高质量图片和插画。适用于设计师、创业者、自由职业者和市场营销人员,提供便捷、高效、多样化的视觉素材生成服务,满足不同需求。
- 7次使用
-
- golang MySQL实现对数据库表存储获取操作示例
- 2022-12-22 499浏览
-
- 搞一个自娱自乐的博客(二) 架构搭建
- 2023-02-16 244浏览
-
- B-Tree、B+Tree以及B-link Tree
- 2023-01-19 235浏览
-
- mysql面试题
- 2023-01-17 157浏览
-
- MySQL数据表简单查询
- 2023-01-10 101浏览