拿下技术面上传简历

库存表 stock(sku varchar 主键, qty int),隔离级别为 RR。扣减写法 A:UPDATE stock SET qty = qty - 1 WHERE sku = ? AND qty >= 1,然后判断 affected rows 是否为 1。写法 B:先 SELECT qty FROM stock WHERE sku = ?,在应用层判断 qty >= 1,再执行 UPDATE stock SET qty = qty - 1 WHERE sku = ?,两个操作都在同一个事务里。现在库存只有 1,两个并发请求各扣 1,分别用 A 和 B 会不会超卖?为什么?

工程与系统设计数据与存储1-3 年知识点 1 个

面试官在考什么

判断候选人是否分得清快照读与当前读,是否知道『先检查再更新』的问题在于检查与动作之间没有原子性,而不是『有没有加事务』。

事务

回答框架 · 前两步

  1. 写法 A 不会超卖:UPDATE ... WHERE qty >= 1 是当前读,会对命中行加排他锁,后到的事务必须等前一个提交后才能读并重新判断条件,扣减和判断在同一条语句里完成。
  2. 写法 B 可能超卖:RR 下普通 SELECT 是快照读、不加锁,两个事务可能都读到 qty=1、都判断通过,随后两个 UPDATE 串行执行,把库存扣成 -1。

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

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

同一能力域的其他题