MySQL 中 事务导致死锁(Deadlock) 是一个复杂但非常重要的问题,尤其在高并发写入的系统中更常见。
下面我会详细讲解:
🧩 一、什么是事务死锁?
死锁是指两个或多个事务相互等待对方释放资源,导致永远无法继续执行下去。
通俗举例:
-
事务 A 拿到了资源 1,等资源 2
-
事务 B 拿到了资源 2,等资源 1
-
两个事务都在等对方释放资源 → 死锁
在 MySQL(InnoDB)中,数据库会自动检测死锁,并 主动回滚其中一个事务 来解除死锁。
🔍 二、常见的死锁场景(示例)
✅ 场景 1:两个事务更新相同表,但顺序不同
-- 事务 A
BEGIN;
UPDATE orders SET status = 'paid' WHERE id = 1;
UPDATE orders SET status = 'paid' WHERE id = 2;
COMMIT;
-- 事务 B(同时进行)
BEGIN;
UPDATE orders SET status = 'paid' WHERE id = 2;
UPDATE orders SET status = 'paid' WHERE id = 1;
COMMIT;
A 锁了 id=1,等 id=2,B 锁了 id=2,等 id=1,形成死锁
✅ 场景 2:事务中先查询再更新(未

最低0.47元/天 解锁文章
1510

被折叠的 条评论
为什么被折叠?



