拿下技术面上传简历

MySQL InnoDB,隔离级别是默认的 REPEATABLE READ。转账逻辑是两条 SQL 包在同一个事务里:UPDATE account SET balance=balance-100 WHERE id=1; 然后 UPDATE account SET balance=balance+100 WHERE id=2;。现在并发跑两笔方向相反的转账(事务 A 从 1 转到 2,事务 B 从 2 转到 1),出现了死锁报错。请说明这个死锁是怎么产生的,以及你会怎么改代码避免它。

工程与系统设计数据与存储校招知识点 1 个

面试官在考什么

判断候选人是否真理解 InnoDB 行锁“执行 UPDATE 时加、提交时才释放”的时机,以及能否用加锁顺序这一可落地手段解释和消除死锁环。

事务

回答框架 · 前两步

  1. 事务 A 先锁 id=1 再锁 id=2,事务 B 先锁 id=2 再锁 id=1;两边各持有一把锁并等待对方释放,形成等待环路,InnoDB 死锁检测发现后回滚其中一个事务。
  2. InnoDB 里 UPDATE 会加排他行锁,并且锁一直持有到事务 COMMIT/ROLLBACK 才释放,不是语句执行完就放,所以中间的等待窗口是真实存在的。

还有 3 条答案要点、 3 层追问、 5 个常见坑, 以及针对你简历的追问路径,在定制报告里。

上传简历,生成我的题库先看示例报告

同一能力域的其他题