MySQL表锁为什么不会出现死锁
截止 2025-02-20, 大语言模型还有进步空间哈
我的回答
首先固定一下上下文,不讨论表锁和行锁形成的死锁, 只讨论表锁与表锁之间。
目前的答案是不会形成死锁,原因官方已经说了 解锁
简单的说就是lock表A并想lock表B的时候会隐式的触发表A的解锁,所以不会存在死锁, 如果想同时锁住A和B, 需要这样
1 | LOCK TABLES job WRITE, user WRITE; |
证明1 X表确实时互斥的
创建User 和Job 表, 每个表有 id 和name 字段
锁住 user 并查询锁的情况
给 user 表 增加列 age, 发现存在锁竞争, 这个DDL pending 住了
解锁 user 表, 发现age 修改好了
证明2 隐式解锁
锁住 user
给user 增加 gender, 发现卡住
锁住 job 表
发现 user 的改动也结束了, 说明user表确实解锁了
补充一下大模型的回答
DeepSeek 回答的不正确
OpenAI 通过引导可以回答正确
MySQL表锁为什么不会出现死锁