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

乐观锁和悲观锁

乐观锁(Optimistic Concurrency Control, OCC)与悲观锁(Pessimistic Locking, PLC)都是为了解决并发修改导致的数据冲突与“丢失更新”问题,只是对“会不会冲突”这个判断的态度不同:悲观锁默认“很可能冲突”,先上锁再操作,典型做法是在数据库里用行级独占锁(如 SELECT ... FOR UPDATE)或在代码里用互斥量(synchronizedReentrantLock)把临界区包住,从拿到锁到提交期间阻塞其他写入;乐观锁默认“通常不冲突”,先读后改但不加写锁,提交时校验“我读时看的版本是否仍然有效”,常见做法是在表里加 version/时间戳列或哈希签名,更新时使用 UPDATE ... SET v=v+1 ... WHERE id=? AND version=?,受影响行数为 0 则说明有人抢先改了,需要重读并重试。两者都能在事务内配合隔离级别与索引生效,乐观锁通常与 MVCC(多版本并发控制)天然契合以实现快照读,悲观锁则更依赖底层锁管理器(行锁、间隙锁、死锁检测)来提供强一致的串行化效果。

相同点:目标一致——保护数据一致性与隔离性、避免丢失更新;都可能让业务重试(乐观锁在提交时失败重试,悲观锁在等待锁或死锁回滚后重试);都需要良好的主键/索引与清晰的事务边界设计。不同点(从工程视角):获取时机——悲观锁在读/写前就锁,乐观锁在提交时校验;代价模型——悲观锁以“等待/阻塞”为主(可导致锁竞争、长事务放大影响、死锁),乐观锁以“失败/重试”为主(在高冲突场景重试过多);吞吐与延迟——读多写少、短事务、热点不高时乐观锁吞吐更高,写多、高冲突、强一致读改写(如“读后立刻必须保证唯一性”)时悲观锁更稳;故障形态——悲观锁要关注死锁与锁超时,乐观锁要设计幂等与指数回退重试;可扩展性——分布式场景下乐观锁易扩展(版本校验是本地判断),悲观锁若跨节点需额外的分布式锁(如基于数据库选主、ZooKeeper、Redis),并要处理时钟与持久化问题。与数据库隔离级别的关系:MVCC 提供快照一致性读,不能自动避免写写冲突,乐观锁的版本校验负责兜底;而悲观锁通过 FOR UPDATE/LOCK IN SHARE MODE 等把潜在修改者串行化,代价是阻塞与锁范围管理(如 InnoDB 的间隙锁在可重复读下防止幻读但可能扩大锁冲突面)。

http://www.xdnf.cn/news/18052.html

相关文章:

  • Opencv 形态学与梯度运算
  • C++ 标准模板库 (^^ゞ 致敬 STL 创始人 Alexander Stepanov
  • React 第七十节 Router中matchRoutes的使用详解及注意事项
  • 【完整源码+数据集+部署教程】胃部病变检测系统源码和数据集:改进yolo11-LSKNet
  • wgs-84坐标到直角坐标系
  • Git 命令指南:从 0 到熟练、从常用到“几乎全集”(含常见报错与解决)建议收藏!!!
  • 大上墨水屏显示器Paperlike253 Mac 特别版 使用体会
  • Git登录配置的详细方法
  • uniapp中uni.showToast和 uni.showLoading同时使用时出现提示中断冲突问题。
  • java设计模式之迪米特法则使用场景分析
  • 佳文赏读 || (CVPR 2025新突破) Robobrain:机器人操作从抽象到具体的统一大脑模型(A Unified Brain Model)
  • 魔搭api功能优化
  • 栈与队列:数据结构中的双生子
  • 【P14 3-6 】OpenCV Python——视频加载、摄像头调用、视频基本信息获取(宽、高、帧率、总帧数),视频保存在指定位置
  • 在职老D渗透日记day18:sqli-labs靶场通关(第26关)get报错注入 过滤or和and基础上又过滤了空格和注释符 ‘闭合 手动注入
  • qt vs2019编译QXlsx
  • Linux软件编程(六)(exec 函数族、system 实现、进程回收与线程通信)
  • C++ 内存管理(内存分布 , 管理方式 , new和delete实现原理)
  • pidgen!DecodeProdKey函数分析之iDecodedBytesMax
  • 服务器硬件电路设计之I2C问答(七):解析 I2C 通信 “卡壳” 难题:从设备无响应与跨电压兼容之道
  • Spring AI Starter和文档解读
  • InfluxDB 数据迁移工具:跨数据库同步方案(一)
  • 超酷炫的Three.js示例
  • Java:File类、递归、字符集、IO流体系及Commons-io框架
  • 【大模型核心技术】Dify 入门教程
  • Flow-GRPO:通过在线 RL 训练 Flow matching 模型
  • PS插件整合包!内置数百款PS插件,支持PS2017-PS2025所有版本!
  • 【学习嵌入式day-26-线程间通信】
  • TypeScript快速入门
  • CPP多线程3:async和future、promise