Yihui’s Blog

MySQL 的乐观锁和悲观锁是什么?

日期:2026-07-11
难度:中等
标签:#面试 #MySQL #并发控制 #锁

一句话答案

悲观锁假设冲突常发生,先加锁再操作;乐观锁假设冲突较少,提交更新时用版本号或条件判断检测冲突,失败后重试或提示。

面试口语版

悲观锁在 MySQL 中通常是事务内 SELECT ... FOR UPDATE,先锁住目标行,其他冲突写入等待,适合库存扣减、强一致且冲突较高的场景。乐观锁一般用业务字段实现,例如 UPDATE product SET stock=stock-1, version=version+1 WHERE id=? AND version=? AND stock>0,受影响行数为 0 就说明版本变化或库存不足,应用决定重读重试。乐观锁不等于数据库没有锁,UPDATE 执行时依然会拿必要的行锁,只是没有提前长时间占锁。

关键细节

  • 悲观锁必须事务短小,且查询条件走索引,否则锁范围可能很大。
  • 乐观锁适合读多写少、冲突低;高冲突下反复重试会浪费资源并产生饥饿。
  • 条件更新的受影响行数是关键判定依据。

面试官追问

  1. 乐观锁失败应无限重试吗?
  2. FOR UPDATE 在 autocommit 下有什么注意点?
  3. 防超卖该选哪一种?

学习清单

  • 准备一段带 version 与 stock > 0 的条件更新 SQL。
维护与整理 · Yihui在 GitHub 上编辑

继续阅读

浏览全部文章

SQL与NoSQL有什么区别?MySQL和MongoDB如何选型?实际项目中如何选择?

日期:2026-09-27 标签:#面试 #MySQL #数据库 难度:简单 来源:牛面 MySQL 题库 答案说明:独立整理(站内题目标记为 VIP,未读取会员答案) 一句话答案 MySQL与MongoDB的主要差异在数据模型、事务边界、查询方式和模式演化;按业务访问模式和一致性需求选型。 面试口语版(约 60…

阅读全文