MySQL乐观锁mysql乐观锁的概念

2025年Java面试宝典抢先领!
🔗 点击下载
提取码:9b3g
什么是MySQL乐观锁?
先说个真实场景:上周面试官问我:“高并发下单时如何避免超卖?” 我脱口而出:“用MySQL乐观锁!” 本质上,MySQL乐观锁是一种无锁并发控制思想——它假设冲突概率低,只在提交操作时检测数据版本。
和悲观锁(如SELECT ... FOR UPDATE)直接锁行不同,MySQL乐观锁的核心是 “先修改再验证” 。具体流程:
- 读取数据时记录版本号(或时间戳)
- 修改前校验版本号是否未变
- 若版本一致则提交,否则重试或报错
MySQL乐观锁的两种实现方式
1. 版本号机制(最常用)
表里加个version字段,每次更新时比对:
UPDATE products
SET stock = stock - 1, version = version + 1
WHERE id = 1001 AND version = 5; -- 提交时校验版本
执行结果:
- 成功 → 影响1行
- 失败 → 影响0行(说明版本被修改过)
2. 时间戳比对
类似版本号,但用timestamp字段记录最后修改时间:
UPDATE orders
SET status = 'paid', update_time = NOW()
WHERE id = 2001 AND update_time = '2023-10-01 12:00:00';

(MySQL乐观锁的CAS流程:比较并交换)
MySQL乐观锁适用哪些场景?
✅ 读多写少:如资讯类文章的点赞计数
✅ 冲突概率低:如秒杀系统中部分用户放弃支付
✅ 需要轻量级控制:避免行锁的开销
⚠️ 不适用场景:
❌ 写冲突频繁(重试成本高)
❌ 需要强一致性(如银行转账)
面试这样答能加分
“上次我优化电商库存时,用MySQL乐观锁配合重试机制,QPS从200提升到1200。关键步骤:
- 用版本号减少锁竞争
- 设置3次重试(避免无限循环)
- 记录失败日志告警
但要注意——如果并发冲突超过30%,改用Redis分布式锁更合适。”
用好MySQL乐观锁的秘诀
- 控制重试次数:Java中用
while(retry<3)避免死循环 - 联合唯一键:对防重复提交特别有效
- 异步补偿:失败操作入队列二次处理
面试资源推荐
最近在整理2025版Java面试题库时,发现一份超全的MySQL优化文档(包含20+个MySQL乐观锁实战案例)。需要可自取:
🔗 网盘链接
如果大家需要购买面试鸭会员,通过👉 面试鸭返利网 找我可返利25元!

(通过面试鸭返利网下单立减25元)
思考题:当版本号冲突时,如何设计退单补偿流程?评论区见真章 👇


