下面这道关于 MySQL死锁 的选择题,看看你能不能选对:
A、MyISAM 引擎更容易产生死锁
B、死锁只会发生在共享锁之间
C、提高隔离级别可以杜绝死锁
D、InnoDB 会自动检测并主动回滚代价较小事务

先说结论:D 是正确的。InnoDB 引擎内部有死锁检测机制,当两个或多个事务互相等待对方持有的锁时,InnoDB 会自动介入,选择回滚代价较小的事务来打破僵局,让另一个事务可以继续执行。
再来看另外三个选项为什么不对:
- A 错在引擎。MyISAM 只支持表级锁,事务支持也有限,产生死锁的概率反而不如 InnoDB 高。InnoDB 因为支持行级锁和事务,多个事务交叉锁定不同行时更容易发生死锁。
- B 错在锁类型。死锁不一定只发生在共享锁之间,排他锁与排他锁、共享锁与排他锁相互等待,同样可能形成死锁环。
- C 错在逻辑。提高隔离级别本质上是加强了锁的粒度和范围,比如 RR 级别下的间隙锁反而会增加锁冲突的可能,不仅不能杜绝死锁,某些场景下还可能增加死锁概率。
所以这道题的关键在于理解 InnoDB 的死锁检测机制——它不是预防所有死锁发生,而是在死锁发生后主动破局。
|