MySQL乐观锁的案例分享
最近在技术面试中,总被问到高并发场景下的数据一致性问题。面试官特别喜欢用"电商库存扣减"的例子考察MySQL乐观锁的实现思路。今天就用程序员视角,分享真实面试中的MySQL乐观锁案例解法,帮大家避坑!
一、什么是乐观锁?
乐观锁的核心是"先操作,后冲突检测"。和悲观锁(直接加排他锁)不同,它通过版本号或时间戳实现无锁并发控制。面试中最常被问的是MySQL乐观锁的两种实现方式:
- 版本号机制:表中增加
version字段,每次更新时校验版本 - 条件校验:利用
update ... where [条件]的原子性
举个典型场景:100人同时抢10件商品。如果不用乐观锁,直接update stock=stock-1会导致超卖!
二、面试真题拆解
面试官:"如何用MySQL乐观锁解决超卖问题?"
我的回答分三步走:
- 表设计加版本字段
CREATE TABLE product ( id INT PRIMARY KEY, stock INT NOT NULL, version INT DEFAULT 0 -- 关键字段! ); - 更新时校验版本
UPDATE product SET stock = stock - 1, version = version + 1 WHERE id = 123 AND stock > 0 AND version = #{old_version} -- 提交前读到的版本号 - 判断执行结果
- 若影响行数=1:操作成功
- 若影响行数=0:版本冲突,提示重试

(图示:MySQL乐观锁的版本控制流程)
三、避坑指南
很多人栽在三个细节上:
- ABA问题:版本号必须自增(不要用时间戳)
- 重试策略:建议指数退避(如首次100ms后重试,第二次200ms...)
- 场景适配:写冲突高的场景(如秒杀)用乐观锁反而降低吞吐量

(图示:不同并发方案性能对比)
四、延伸考点
进阶问题往往围绕MySQL乐观锁的变体:
- 如何用
update ... where stock=原值代替版本号? - Redis+Lua实现分布式乐观锁?
- 对比ZooKeeper的乐观锁方案?
🔥 2025年Java面试宝典最新开放:
🔹 百度网盘链接
🔹 提取码:9b3g
涵盖MySQL、分布式、并发等600+真题解析,亲测拿offer神器!
最后安利个小福利:如果需要开面试鸭会员,通过面试鸭返利网找我可返25元!用省下的钱买杯咖啡☕,刷题更带劲~

(扫码直达活动页)


