MySQL悲观锁是解决高并发数据竞争的关键技术,通过SELECT FOR UPDATE实现行级锁定,确保事务操作的原子性和一致性。本文深度解析悲观锁的实现原理、使用场景及面试高频考点,涵盖死锁规避、性能优化等实战技巧。对比乐观锁差异,提供电商库存扣减等典型应用案例,帮助开发者掌握InnoDB行锁机制。附赠2025年Java面试宝典资源,包含大厂真题解析,助力攻克数据库锁相关面试难题。学习悲观锁的正确使用姿势,提升系统并发控制能力。
🔵2025年Java面试宝典:
链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g 提取码: 9b3g
简单说,悲观锁就是“先防后做”——默认并发操作会冲突,访问数据前先加锁。在MySQL中,悲观锁主要依赖数据库自身的锁机制(如行锁、表锁)实现。举个例子:电商扣库存时,直接锁住商品记录,确保当前事务完成前其他事务无法修改。
核心就一招:SELECT ... FOR UPDATE
。
在事务中执行该语句,MySQL会对查询结果集加排他锁(X锁),其他事务无法修改或加共享锁,直到当前事务提交或回滚。
BEGIN;
SELECT * FROM products WHERE id = 1001 FOR UPDATE; -- 锁住id=1001的行
UPDATE products SET stock = stock - 1 WHERE id = 1001;
COMMIT;
(释放锁)💡关键点:
FOR UPDATE
必须配合事务使用,否则锁立即释放- 锁的粒度取决于查询条件(走索引锁行,否则可能锁表)
- 超时机制:
innodb_lock_wait_timeout
控制等待锁的时间(默认50秒)
面试官问:“如何防止超卖?” 你可以答:
“用
SELECT ... FOR UPDATE
锁住商品行,在事务内校验库存并扣减。比如:BEGIN; SELECT stock FROM items WHERE id=123 FOR UPDATE; -- 检查stock>0后执行UPDATE UPDATE items SET stock=stock-1 WHERE id=123; COMMIT;
✅ 优化建议:
当面试官问“悲观锁和乐观锁区别?”时,快速对比:
| 维度 | 悲观锁 | 乐观锁 |
|----------------|--------------------------|----------------------|
| 实现原理 | 先加锁再操作 | 冲突检测+重试 |
| 适用场景 | 写多读少、强一致性 | 读多写少、容忍重试 |
| 数据库支持 | SELECT FOR UPDATE
| 版本号/时间戳字段 |
| 性能影响 | 并发高时阻塞严重 | 并发冲突少时性能更佳 |
如果你需要购买面试鸭会员,通过 面试鸭返利网 找我,可额外返利25元!海量大厂真题+详解,锁定核心考点不迷路→
悲观锁是事务安全的“守门员”,FOR UPDATE
一出手,数据竞争绕道走。搞清锁粒度、事务边界和场景适配,面试直接拿捏!
📌 锁机制示意图:
(图示:事务A持有行锁时,事务B的修改操作被阻塞)
更多面试硬核干货→ 面试鸭题库
扫码联系我返利
(当前返利8元,金额随官方实际价格波动,最好提前咨询)
面试鸭小程序码
美团大额优惠券,给自己加个鸡腿吧!
今日有支付宝大红包赶快领,手慢无
支付宝扫码领取1-8元无门槛红包