Mysql是否发生死锁,死锁场景【转】
之前在面试中被问到此问题,在此做下笔记!
Mysql场景的存储引擎为MyISAM和InnoDB,我们以这两种来分析。
MyISAM
总:MyISAM中不会出现死锁。
在MyISAM中只用到表锁,不会有死锁的问题,锁的开销也很小,但是相应的并发能力很差。
解析:MyISAM不支持事务,即每次的读写都会隐性的加上读写锁,而我们知道读锁是共享的,写锁是独占的,意味着当一个Session在写时,另一个Session必须等待。
InnoDB
*总:InnoDB中会出现死锁。
InnoDB中实用了行锁和表锁,当未命中索引时,会自动退化为表锁。
我们举一个出现死锁的例子。
假设我们有个账户金额表 user_balance,包括两个字段,分别是 username 用户名、balance 余额。(例子来源极客时间“sql必知必会”)
某时刻用户 A 和用户 B 之间进行转账,同时数据库管理员想要查询 user_balance 表中的总金额:
SELECT SUM(balance) FROM user_balance
1
当我们读取的时候用了加行锁,可能会出现死锁的情况,若 B 开始执行给 A 转账:
UPDATE user_balance SET balance=balance-100 WHERE username ='B'
1
UPDATE user_balance SET balance=balance+100 WHERE username =‘A’
UPDATE user_balance SET balance=balance+100 WHERE username ='A'
1
我们会发现此时 A 被锁住了,而管理员事务还需要对 B 进行访问,但 B 被用户事务锁住了,此时就发生了死锁。
解决方法为InnoDB中的MVCC机制,之后的博客再做介绍,或者读者可以自行了解下这种机制。
————————————————
版权声明:本文为CSDN博主「Hpsyche」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Hpsyche/article/details/102076870
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)