尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

System Design 101:悲观锁 vs 乐观锁——多用户并发下的数据一致性策略全解析

System Design 101:悲观锁 vs 乐观锁——多用户并发下的数据一致性策略全解析 后端文档教程【免费下载链接】system-design-101Explain complex systems using visuals and simple terms. Help you prepare for system design interviews.项目地址https://gitcode.com/GitHub_Trending/sy/system-design-101点击查看免费下载本指南以仓库 README 中收录的 pessimistic-vs-optimistic-locking 指南 为核心系统讲解悲观锁与乐观锁两种并发控制策略的机制、取舍与最佳实践。读完本文你将能够判断在具体业务场景中该选用哪种锁理解如何控制锁粒度、减少持锁时间、编写冲突重试逻辑并借助仓库内关联文档数据库锁、隔离级别、死锁、热点账户、重试策略建立完整的并发控制知识链直接服务于系统设计面试与生产系统设计。为什么多用户环境需要锁在多用户并发访问的系统中多个事务可能同时对同一份数据执行读、写操作。如果没有协调机制就会产生数据不一致例如两个用户同时修改同一个账户余额、两个订单同时扣减同一库存最终落库的值可能丢失其中一次更新即经典的丢失更新问题。锁Lock正是用于维护这种场景下数据一致性与完整性的核心机制——它协调对共享资源的访问顺序阻止同时发生的修改互相覆盖从而保证数据在任意时刻都处于可预期的一致状态。关于锁的基础形态可以联动阅读仓库中的 数据库锁详解其中归纳了共享锁S Lock、排他锁X Lock、更新锁U Lock、行级锁、页级锁、表级锁、键范围锁等常见锁类型——悲观锁和乐观锁正是建立在加锁时机这一维度之上的两种顶层策略。悲观锁Pessimistic Locking先锁后改假设冲突必然发生悲观锁的核心理念是假定并发冲突大概率会发生因此在任何修改发生之前就先对目标数据加锁把数据保护起来。在锁被释放之前其他用户无法访问、也无法更新这份数据只能等待。典型的悲观锁工作流如下事务 A 对目标行加锁例如通过SELECT ... FOR UPDATE获取排他锁事务 A 读取并修改数据在事务 A 提交、释放锁之前事务 B 尝试访问同一行时被阻塞Blocking只能等待事务 A 提交后释放锁事务 B 才得以继续执行。从底层机制看悲观锁依赖的是数据库的排他锁/共享锁体系排他锁持有期间其他事务既不能读也不能写详见 数据库锁详解。这种等待式的协调保证了极强的数据完整性——同一时刻只有持有锁的事务能修改数据冲突在源头就被拦截。悲观锁的典型代价悲观锁以等待换绝对安全代价同样明显持锁期间并发度骤降其他事务被阻塞系统整体吞吐受限存在死锁风险多个事务互相等待对方持有的锁可能陷入互相等待、无法推进的状态详见仓库中的 什么是死锁——Coffman 条件的循环等待正是悲观锁最容易触发的场景热点数据放大瓶颈仓库 处理热点账户 一文给出了一个典型佐证当某个账户如大促中的商家账户被频繁更新时每次更新都对其加行锁这种锁定机制会导致吞吐量低下成为系统瓶颈。乐观锁Optimistic Locking先改后验假设冲突很少发生乐观锁的核心理念是假定并发冲突很少发生因此不加锁地允许多个用户同时访问和操作数据等到提交Commit时才检查是否存在冲突一旦检测到冲突该操作即被回滚或重试。乐观锁通常不依赖数据库的锁机制而是依赖版本校验类手段常见实现方式包括版本号Version机制为每条记录维护一个version字段每次成功更新将版本号加一提交更新时以WHERE version 读取时的版本号作为条件若影响行数为 0说明版本已被他人修改判定冲突时间戳Timestamp机制以记录的最后修改时间戳作为校验依据原理与版本号类似CASCompare-And-Swap在比较当前值等于期望值后才写入新值不满足则拒绝。乐观锁的执行过程不阻塞任何读者因此并发度高、性能好其代价是冲突检测发生在提交阶段一旦冲突频繁发生就会出现大量失败回滚反而需要额外的重试成本。从这个角度看乐观锁更适合读多写少、冲突率低的场景。关于冲突检测成功后如何恢复可联动阅读仓库中的 故障重试策略其中讨论了线性退避、线性抖动退避、指数退避、指数抖动退避等策略用于指导冲突事务的等待与重试间隔设计。悲观锁与乐观锁核心对比维度悲观锁乐观锁对冲突的假设假设冲突频繁发生假设冲突很少发生加锁时机修改之前先加锁不加锁提交时才校验冲突处理阻塞等待冲突被源头拦截提交时检测冲突失败则回滚/重试并发能力低持锁阻塞其他事务高读写互不阻塞数据完整性强依赖冲突检测与重试兜底性能表现可能成为吞吐瓶颈见 热点账户 案例读多写少场景下效率更高主要风险死锁、锁等待、热点争用冲突回滚率上升、重试放大写放大典型实现SELECT ... FOR UPDATE、排他锁见 数据库锁详解版本号、时间戳、CAS最佳实践六条可落地的并发控制准则原指南给出了以下核心最佳实践逐一展开如下1. 尽可能缩短锁的持有时间降低争用无论使用哪种策略持锁/校验区间越短并发争用越小。落地手段包括只在真正需要修改的临界区内加锁尽早提交Commit释放锁避免把耗时网络调用、外部 IO 放入持锁区间在 数据库隔离级别 的框架下选择满足业务要求的最低隔离级别——隔离级别越高锁持有的范围与时间通常越长与性能的权衡需显式做出。2. 在最小粒度上加锁行级优先于表级锁粒度越大被阻塞的数据越多。应优先使用行级锁而非表级锁、页级锁让不相关的行仍可被并发访问。仓库的 数据库锁详解 明确说明行级锁只锁定表中特定的一行允许其他行被并发访问而表级锁实现简单但会显著降低并发度。3. 为冲突失败的事务实现重试逻辑乐观锁提交失败、悲观锁超时回滚后业务层都应具备重试能力。重试间隔的设计可参考 故障重试策略线性退避Linear backoff按固定间隔递增等待时间实现简单指数退避Exponential backoff间隔指数增长显著降低高并发下的重试碰撞抖动Jitter在退避间隔中引入随机量打散各客户端的重试时间避免重试风暴Retry Storm。4. 悲观锁数据完整性更强但可能影响性能若业务对数据一致性要求极高如金融账务、库存扣减且冲突确实高频悲观锁的源头拦截价值更大但要清醒认识到其吞吐代价——热点账户 一文展示了高并发更新同一行时的行锁瓶颈并给出了分流思路限流、拆分子账户、先用缓存更新余额再异步落库。5. 乐观锁效率和性能更优但需接受冲突回滚在低冲突、高并发的读多写少场景乐观锁几乎没有阻塞成本是更优选择。使用乐观锁时还需配合以下工程约束版本号字段必须随更新原子递增校验与更新必须在同一条 SQL 中完成避免竞态冲突率上升后要评估回滚与重试对数据库的写放大影响若冲突率持续偏高说明场景假设不再成立应评估切换为悲观锁或引入分片/子账户等架构手段。6. 用隔离级别视角统摄两种策略两种锁策略并不孤立它们共同服务于事务隔离目标。仓库的 数据库隔离级别 指出隔离性由 MVCC多版本并发控制与锁共同保证从 Serializable 到 Read Uncommitted隔离强度逐级递减——其中 Serializable 通常依赖更强的锁偏向悲观而 Read Committed / Repeatable Read 则更多依赖 MVCC 快照偏乐观。在设计系统时应把选择哪种锁放到需要什么隔离级别的大前提下统一决策。如何选择决策要点清单在实际系统设计中可按下述清单快速收敛方案冲突概率高还是低高冲突写多、热点集中倾向悲观锁低冲突读多写少倾向乐观锁能否接受提交阶段失败业务语义上允许回滚重试乐观锁可行要求一次成功如强一致的账务扣减悲观锁更稳并发吞吐是否是硬指标悲观锁的阻塞等待在高并发下可能成为瓶颈此时乐观锁或拆分热点 异步化见 热点账户是更优路径是否已具备重试基础设施选择乐观锁前确认应用层已有 重试策略 支撑冲突回滚死锁与运维成本是否可控悲观锁需要关注 死锁 检测与超时设置资源有序申请、超时回滚、银行家算法规避乐观锁则需要维护版本字段与冲突监控。面试视角一句话讲清两种锁在系统设计面试中推荐用冲突假设这一核心差异串联回答悲观锁假设冲突必然发生因此在修改前加锁、阻塞其他事务用等待换取强一致性乐观锁假设冲突很少发生因此不加锁、允许多用户并发修改在提交时通过版本号校验冲突检测到冲突就回滚重试。前者保完整、性能受限后者提效率、以重试兜底。结合本文讨论的锁粒度、持锁时长、重试策略、热点账户等配套手段即可在面试或实战中给出有依据、可落地的并发控制方案。本文相关的仓库延伸阅读数据库锁详解数据库隔离级别什么是死锁处理热点账户故障重试策略Database and Storage 分类赞分享后端文档教程【免费下载链接】system-design-101Explain complex systems using visuals and simple terms. Help you prepare for system design interviews.项目地址https://gitcode.com/GitHub_Trending/sy/system-design-101点击查看免费下载相关推荐数据库并发控制机制Awesome Design Patterns 乐观与悲观锁数据库并发控制机制Awesome Design Patterns 乐观与悲观锁 为什么需要并发控制 你是否遇到过这些问题电商秒杀时商品超卖转账操作导致余额文档技术博客Hibernate ORM乐观锁与悲观锁实战并发控制策略对比Hibernate ORM乐观锁与悲观锁实战并发控制策略对比 在多用户并发操作数据库时如何保证数据一致性是开发者面临的核心挑战。Hibernate ORM提后端数据库ORM旧款 Mac 连 CarPlay 车机怎么打通OpenCore Legacy Patcher 完整指南旧款 Mac 连 CarPlay 车机怎么打通OpenCore Legacy Patcher 完整指南 2013 年的 MacBook Pro 还能不能连车机操作系统固件驱动开发上一篇React Native SVG遮罩动画终极指南轻松实现动态元素显示与隐藏下一篇3步搞定黑苹果EFI配置OpCore-Simplify的智能革命创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表