当前位置: 首页 > news >正文

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流更适合乐观锁。

http://www.dtcms.com/a/335044.html

相关文章:

  • 关于“卷积“
  • 《智能体(Agent)速记指南》
  • Linux进程概念(四)环境地址变量
  • 算法第四十六天:动态规划part13(第九章)
  • STM32 软件I2C读写MPU6050
  • Redis入门与背景详解:构建高并发、高可用系统的关键基石
  • Linux系统编程练习、作业
  • Flink Stream API 源码走读 - 总结
  • 差分约束.
  • 腾讯混元大模型:实现3D打印产品生成的自动化平台
  • [Python 基础课程]继承
  • [Linux] RAID存储技术
  • 【102页PPT】电子行业数字化解决方案(附下载方式)
  • 容器化部署:用Docker封装机器翻译模型与服务详解
  • 服务器可以ping通,但部署的网站打不开
  • MyBatis 的 SQL 拦截器:原理、实现与实践
  • 基于Spring Boot的快递物流仓库管理系统 商品库存管理系统
  • OpenStack Neutron中的L2 Agent与L3 Agent:新手友好指南
  • Nginx蜘蛛请求智能分流:精准识别爬虫并转发SEO渲染服务
  • RemoteCtrl-初步的网络编程框架搭建
  • Linux 多线程:线程回收策略 线程间通信(互斥锁详解)
  • Easytier异地组网与Nginx反向代理
  • 昇腾AI自学Day2-- 深度学习基础工具与数学
  • 楼宇自控系统赋能建筑全维度管理,实现环境、安全与能耗全面监管
  • 计算分组内时间列的最大差值
  • 【AI论文】NextStep-1:迈向大规模连续令牌自回归图像生成
  • Warning: Unable to create personal MATLAB work folder:E:\绯荤粺榛樿\鏂囨。\MATLAB
  • 1083. 数列极差问题
  • 【深度学习】基于ESRNet模型的图像超分辨率训练
  • pytest介绍(python测试框架)(@pytest.mark.parametrize、@pytest.fixtures)