MySQL锁机制:悲观锁VS乐观锁详解

以下是MySQL悲观锁与乐观锁的详细解析:

一、核心概念对比

特性悲观锁乐观锁
加锁时机操作前加锁提交时检查冲突
实现原理数据库原生锁机制版本号/时间戳校验
并发性能高冲突场景稳定低冲突场景高效
典型应用库存扣减、支付交易评论计数、配置更新

二、悲观锁实现细节

  1. InnoDB锁类型

    • 排他锁(X锁)SELECT ... FOR UPDATE锁定记录,阻塞其他写操作
    • 共享锁(S锁)LOCK IN SHARE MODE允许多读但禁止写
    • 间隙锁:防止幻读,锁定索引记录间隙
  2. 使用示例

    START TRANSACTION;
    SELECT stock FROM products WHERE id=1001 FOR UPDATE; -- 锁定行
    UPDATE products SET stock=stock-1 WHERE id=1001;     -- 保证原子性
    COMMIT;
    

    需确保操作在事务中且命中索引,否则退化为表锁

三、乐观锁实现方案

  1. 版本号机制

    -- 建表时增加version字段
    UPDATE products 
    SET name='新品', version=version+1 
    WHERE id=1 AND version=5; -- 版本校验
    

    返回受影响行数为0时需重试

  2. 时间戳方案

    UPDATE orders 
    SET status='paid', last_modified=NOW() 
    WHERE id=100 AND last_modified='2025-08-16 10:00:00';
    

四、选型决策树

高并发写?
数据冲突频繁?
采用乐观锁
采用悲观锁

五、性能优化建议

  1. 悲观锁避免长事务,锁定后尽快提交
  2. 乐观锁需设置重试次数上限(如3次)
  3. 混合使用:热点数据用悲观锁,非热点用乐观锁

六、特殊场景处理

  • 乐观锁ABA问题:追加时间戳或业务流水号校验
  • 悲观锁死锁:通过SHOW ENGINE INNODB STATUS分析死锁链

两种锁机制本质是并发控制时空观的差异:悲观锁以空间换时间(提前锁定),乐观锁以时间换空间(事后校验)。实际开发中应根据业务特征选择,金融交易类推荐悲观锁,社交feed流更适合乐观锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码的余温

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值