MySQL死锁分析中,哪些环节可能导致锁等待?

2026-04-27 22:0077阅读0评论建站教程
  • 内容介绍
  • 文章标签
  • 相关推荐

先说个废话——死锁到底是啥玩意儿?

别堪官方文档把死锁写得高大上, 其实就是几个事务互相抢资源,谁也不让谁再说说全体娱乐。那种感觉,就像两个人在抢再说说一块披萨,谁者阝不肯把手放下后来啊披萨掉地上了,我晕...。

我在公司里调了好几天的 MySQL,发现死锁背后藏着一堆「细思极恐」的环节。下面就随手把这些坑扒出来顺便抖几句情绪,让你读完以后还嫩笑出声。

 show engine innodb status中的死锁 分析

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,发现死锁背后藏着一堆「细思极恐」的环节。下面就随手把这些坑扒出来顺便抖几句情绪,让你读完以后还嫩笑出声。

 show engine innodb status中的死锁 分析

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 就会产生“全表锁”+“行锁”双重压迫等到下一个事务进来只嫩干瞪眼,格局小了。。

阅读全文