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

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.xdnf.cn/news/17935.html

相关文章:

  • vector 手动实现 及遇到的各种细节问题
  • Azure AI Search 探索总结
  • 通配符 重定向 管道符
  • 数字分类:机器学习经典案例解析
  • vscode中使用CMake Tools生成compile_commands.json文件后,如何告诉clangd这个文件在哪里呢?
  • 【Linux系统】进程间通信:System V IPC——共享内存
  • 23. CommonJS 和 ES6 Module 区别
  • [1Prompt1Story] 生成行为控制器 | 语义向量重加权(SVR)
  • 【计算机视觉与深度学习实战】03基于Canny、Sobel和Laplacian算子的边缘检测系统设计与实现
  • Day11 栈与队列part2
  • duiLib 实现鼠标拖动状态栏时,窗口跟着拖动
  • webrtc弱网-VideoSendStreamImpl类源码分析与算法原理
  • 《Leetcode》-面试题-hot100-技巧
  • 嵌入式硬件篇---常见的单片机型号
  • 按键及消抖
  • Python环境下载安装、以及环境配置教程(Windows版)
  • java项目怎么实现用户行为分析、漏斗转化、数据可视化报表。
  • C语言零基础第18讲:自定义类型—结构体
  • 楼宇自控系统赋能建筑全维度管理,实现环境、安全与能耗全面监管
  • [Oracle数据库] Oracle 复杂查询
  • 当 GitHub 宕机时,我们如何协作?
  • Flink Sql 按分钟或日期统计数据量
  • 从 “视频孪生” 到 “视频动态目标三维重构”:技术演进与核心突破
  • PHP域名授权系统网站源码_授权管理工单系统_精美UI_附教程
  • 基于W55MH32Q-EVB 实现 HTTP 服务器配置 OLED 滚动显示信息
  • 企业级Java项目金融应用领域——银行系统
  • 【P40 6-3】OpenCV Python——图像融合(两张相同属性的图片按比例叠加),addWeighted()
  • B3924 [GESP202312 二级] 小杨的H字矩阵
  • Java后台生成多个Excel并用Zip打包下载
  • 《Python学习之字典(一):基础操作与核心用法》