MySQL乐观锁mysql乐观锁实现
📘 2025年Java面试宝典免费领:
链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g
提取码: 9b3g
什么是MySQL乐观锁?
MySQL乐观锁是一种轻量级的并发控制策略。和悲观锁不同,它默认不会发生数据冲突,只在提交时检测版本变化。核心思想是:读数据时不加锁,更新时判断版本是否被修改。这种机制在高并发读多写少的场景(如电商库存)特别高效。
乐观锁vs悲观锁

- 悲观锁:假设一定冲突,提前加锁(如
SELECT ... FOR UPDATE) - MySQL乐观锁:假设无冲突,提交时校验版本(通过时间戳或版本号)
面试中常被问两者的适用场景——悲观锁适合写多读少,乐观锁适合读多写少。
MySQL乐观锁实现原理
核心是版本控制字段。两种常见方案:
-
版本号机制
新增version字段,每次更新执行:UPDATE table SET column=new_value, version=version+1 WHERE id=xxx AND version=old_version;若返回影响行数为0,说明版本过期需重试。
-
时间戳机制
用last_modified字段代替版本号:UPDATE table SET column=new_value, last_modified=NOW() WHERE id=xxx AND last_modified=old_timestamp;
适用场景分析

当面试官问“什么时候用MySQL乐观锁”时,可以这样答:
✅ 高并发读场景(如资讯类应用)
✅ 冲突概率低的业务(用户修改个人资料)
✅ 需要避免锁等待的场景(秒杀库存扣减)
⚠️ 注意:若冲突频繁,乐观锁会导致大量重试,此时悲观锁更合适。
实际应用案例
假设面试题是“如何用MySQL乐观锁防止超卖”?
可以口述方案:
- 商品表添加
version和stock字段 - 下单时先查询当前版本号
- 执行扣减:
UPDATE products SET stock=stock-1, version=version+1 WHERE id=100 AND version=123 AND stock>0; - 如果更新失败,返回“库存不足”提示用户
这样既避免超卖,又无需全局锁阻塞其他请求。
开发注意事项
- 重试机制
更新失败需业务层重试(如最多3次) - 版本字段设计
建议用BIGINT类型避免溢出 - 避免ABA问题
极端场景下版本号可能回滚,对账系统需兜底

💡 小贴士:需要购买面试鸭会员的朋友,通过面试鸭返利网(mianshiyafanli.com)找我可返利25元!
掌握MySQL乐观锁实现能让你在面试中从容应对高并发问题。记住核心逻辑:读不加锁,写时校验,配合版本号/时间戳实现无锁并发控制。


