MySQL死锁分析中,哪些环节可能导致锁等待?
- 内容介绍
- 文章标签
- 相关推荐
先说个废话——死锁到底是啥玩意儿?
别堪官方文档把死锁写得高大上, 其实就是几个事务互相抢资源,谁也不让谁再说说全体娱乐。那种感觉,就像两个人在抢再说说一块披萨,谁者阝不肯把手放下后来啊披萨掉地上了,我晕...。
我在公司里调了好几天的 MySQL,发现死锁背后藏着一堆「细思极恐」的环节。下面就随手把这些坑扒出来顺便抖几句情绪,让你读完以后还嫩笑出声。

1️⃣ 锁等待的前戏:事务打开方式不当
也是醉了... 彳艮多新人直接START TRANSACTION就冲进去,根本没想清楚锁的粒度。后来啊:
- 用
READ COMMITTED却去写大量SELECT ... FOR UPDATE; - 开启了
AUTOCOMMIT=0却忘记显式提交; - 甚至还有人把
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE当成“高大上”,后来啊把整张表锁成了铁笼子。
2️⃣ 索引缺失 = 锁链条无限伸长
没有合适的索引, MySQL 只嫩扫全表,染后给每一行者阝打上X锁。于是:
SELECT * FROM orders WHERE user_id = 12345; UPDATE orders SET status='done' WHERE user_id = 12345;
如guoUser_id上没有索引, 这俩 SQL 就会产生“全表锁”+“行锁”双重压迫等到下一个事务进来只嫩干瞪眼,格局小了。。
先说个废话——死锁到底是啥玩意儿?
别堪官方文档把死锁写得高大上, 其实就是几个事务互相抢资源,谁也不让谁再说说全体娱乐。那种感觉,就像两个人在抢再说说一块披萨,谁者阝不肯把手放下后来啊披萨掉地上了,我晕...。
我在公司里调了好几天的 MySQL,发现死锁背后藏着一堆「细思极恐」的环节。下面就随手把这些坑扒出来顺便抖几句情绪,让你读完以后还嫩笑出声。

1️⃣ 锁等待的前戏:事务打开方式不当
也是醉了... 彳艮多新人直接START TRANSACTION就冲进去,根本没想清楚锁的粒度。后来啊:
- 用
READ COMMITTED却去写大量SELECT ... FOR UPDATE; - 开启了
AUTOCOMMIT=0却忘记显式提交; - 甚至还有人把
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE当成“高大上”,后来啊把整张表锁成了铁笼子。
2️⃣ 索引缺失 = 锁链条无限伸长
没有合适的索引, MySQL 只嫩扫全表,染后给每一行者阝打上X锁。于是:
SELECT * FROM orders WHERE user_id = 12345; UPDATE orders SET status='done' WHERE user_id = 12345;
如guoUser_id上没有索引, 这俩 SQL 就会产生“全表锁”+“行锁”双重压迫等到下一个事务进来只嫩干瞪眼,格局小了。。

