MySQL · 单选题 · 第 39 题
Java 后端开发面试 · 第 39 题
两个事务在 InnoDB 中发生死锁时,MySQL 默认会怎么处理?
- A主动检测到死锁,回滚其中代价较小的事务;另有锁等待超时参数兜底
- BMySQL 不会检测死锁,只能由运维人员手动重启实例来解除
- C同时提交这两个事务,由后提交的那个事务覆盖先提交事务所做的修改
- D两个事务永远互相等待下去,直到客户端主动断开数据库连接
答案
A A. 主动检测到死锁,回滚其中代价较小的事务;另有锁等待超时参数兜底
解析
innodb_deadlock_detect 默认开启,InnoDB 维护等待图,一旦发现环,就选择一个回滚(通常是修改行数少的),另一个继续执行,被回滚的一方收到 1213 错误,应用应当重试。高并发热点行场景下,死锁检测本身会消耗大量 CPU。innodb_lock_wait_timeout 默认 50 秒。