MySQL通过InnoDB的自动死锁检测机制识别并处理死锁,主要依赖innodb_deadlock_detect参数开启检测,发生时通过SHOW ENGINE INNODB STATUS查看“LATEST DETECTED DEADLOCK”信息,结合事务、锁等待及SQL语句分析原因,并建议通过统一访问顺序、缩小事务范围等手段减少死锁。
MySQL检测死锁主要依赖InnoDB存储引擎的自动死锁检测机制。当多个事务相互等待对方持有的锁时,就会发生死锁。InnoDB会主动识别这种情况并终止其中一个事务,以打破循环等待,保证系统继续运行。
InnoDB默认开启死锁检测,由以下参数控制:
建议保持innodb_deadlock_detect=ON,以便快速发现并处理死锁。
当死锁发生并被InnoDB解决后,可以通过以下方式查看详细信息:
aits(MySQL 8.0+):提供更细粒度的锁信息,可用于实时分析锁冲突假设表t有主键id:
-- 事务1 BEGIN; UPDATE t SET name='a' WHERE id=1;-- 事务2
BEGIN; UPDATE t SET name='b' WHERE id=2; UPDATE t SET name='c' WHERE id=1; -- 等待事务1释放锁-- 事务1 UPDATE t SET name='d' WHERE id=2; -- 等待事务2,形成死锁
此时InnoDB会检测到死锁,自动回滚其中一个事务。通过SHOW ENGINE INNODB STATUS即可看到完整过程。
虽然MySQL能自动处理死锁,但频繁死锁会影响性能。可通过以下方式降低发生概率:
基本上就这些。MySQL的死锁检测是自动的,关键在于如何查看日志和优化应用逻辑来减少其发生。