当前位置: 首页 > 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.lryc.cn/news/623357.html

相关文章:

  • 初识c语言————宏定义和调用
  • C语言零基础第18讲:自定义类型—结构体
  • 新手向:GitCode疑难问题诊疗
  • C语言:文件操作详解
  • 从 MySQL 5.7 迁移到 8.0:别让 SQL 文件 “坑” 了你
  • 双指针和codetop复习
  • 【LeetCode每日一题】
  • JavaWeb开发_Day14
  • 嵌入式 Linux LED 驱动开发实验
  • Proteus 入门教程
  • KingbaseES主备读写分离集群安装教程
  • 通配符 重定向 管道符
  • 心路历程-三个了解敲开linux的大门
  • 高等数学 8.4 空间直线及其方程
  • 机器学习 [白板推导](十二)[卡曼滤波、粒子滤波]
  • Python语言---OrangePi全志H616
  • CPP多线程1:C++11的std::thread
  • Spring AI 进阶之路01:三步将 AI 整合进 Spring Boot
  • linux设备驱动之字符设备驱动
  • 链式二叉树的基本操作——遍历
  • 【论文笔记】Multi-Agent Based Character Simulation for Story Writing
  • 同创物流学习记录2·电车
  • 聊聊智慧这个东西之三:从食物的毒性、偏性聊起
  • 探秘gRPC——gRPC原理详解
  • [优选算法专题二滑动窗口——最大连续1的个数 III]
  • implement libwhich for Windows
  • Azure AI Search 探索总结
  • 软考 系统架构设计师系列知识点之杂项集萃(124)
  • [Responsive theme color] 动态主题 | 色彩工具函数 | HEX与RGB
  • OpenStack Neutron中的L2 Agent与L3 Agent:新手友好指南