ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

分布式锁和分布式事务的区别

分布式锁和分布式事务的区别 分布式锁和分布式事务都是分布式系统中用于协调多节点、保证数据一致性的重要机制但它们解决的问题、粒度、侧重点完全不同。下面从多个维度进行详细对比一、核心定义与目的本质问题 解决 “并发冲突” 问题。防止多个进程同时修改同一个资源导致数据错乱。 解决 “跨节点数据一致性” 问题。确保多个独立数据源之间的状态变化符合预期。类比 公共厕所的门锁一个人进去锁上门其他人必须等待。只关心谁在用不关心用完后的结果是否和另一个厕所里的操作相关联。 银行转账A账户扣钱和B账户加钱必须是一个整体。关心的是多个操作的最终结果是否一致。二、关键区别详解作用范围与粒度• 分布式锁作用于单个共享资源或一组紧密耦合的资源如一个Redis key、一个ZooKeeper节点。◦ 粒度细粒度。通常锁定的是一个具体的数据项或操作入口。• 分布式事务作用于多个独立的资源管理器如不同的数据库、消息队列、服务。◦ 粒度粗粒度。它管理的是一个业务流程中涉及的所有数据变更。解决的问题类型• 分布式锁解决 “写冲突” 。例如◦ 秒杀场景多个请求抢购同一件商品只能有一个请求成功扣减库存。 ◦ 定时任务集群中多个服务器上的同一个定时任务只允许一台执行。 ◦ 幂等性控制防止重复提交。• 分布式事务解决 “跨服务/跨库的业务一致性” 。例如◦ 下单支付订单服务创建订单 支付服务扣款 库存服务减库存。这三个操作必须同时成功或失败。 ◦ 跨行转账A银行扣钱 B银行加钱。实现原理与复杂度• 分布式锁◦ 原理依赖一个外部协调组件如Redis、ZooKeeper、Etcd提供排他能力。通过SETNX、create ephemeral node等原子操作实现。 ◦ 复杂度相对较低。主要需处理死锁设置过期时间、锁重入、锁续期等问题。• 分布式事务◦ 原理基于一系列协议和算法如两阶段提交2PC、三阶段提交3PC、TCCTry-Confirm-Cancel、SAGA、本地消息表、最大努力通知等。 ◦ 复杂度非常高。需要处理网络故障、节点宕机、超时、幂等、回滚补偿等一系列复杂情况。对性能的影响• 分布式锁低开销。通常是一次网络请求一次内存操作如Redis耗时在毫秒级。即使有少量等待整体吞吐量依然很高。• 分布式事务高开销。◦ 强一致性方案如2PC需要多次网络交互、锁定资源、协调者单点瓶颈严重降低吞吐量不适合高并发。 ◦ 柔性事务方案如TCC/SAGA虽然避免了长锁但仍需要额外的业务逻辑Try、Confirm、Cancel和异步协调性能开销比单纯加锁大得多。典型应用场景• 分布式锁◦ 秒杀/抢购库存扣减。 ◦ 分布式定时任务调度。 ◦ 唯一ID生成器防重。 ◦ 分布式文件锁。• 分布式事务◦ 金融交易转账、支付、结算。 ◦ 电商订单履约下单-支付-发货。 ◦ 跨库数据同步如用户中心与订单中心。三、关系与常见误区它们是正交关系不是替代关系。分布式锁不能替代分布式事务。比如你用分布式锁锁住A账户但无法保证B账户的操作与A账户的操作在一个原子单元内。锁只解决了“谁先改”的问题没解决“改了之后另一个地方改不改”的问题。分布式事务可以包含分布式锁。在某些分布式事务实现中如TCC的Try阶段可能会用分布式锁来保护局部资源防止在事务执行过程中被其他非事务请求篡改。常见误区“用分布式锁实现了数据一致性就不需要分布式事务了。”错误。假设一个场景用户下单后需要同时更新订单状态和扣减库存。如果你只用分布式锁锁住“订单号”这个资源那么两个服务订单服务、库存服务仍然可能因为网络问题导致订单更新成功但库存扣减失败。锁只保证了这两个操作不会同时发生但无法保证它们作为一个整体成功或失败。这恰恰是分布式事务要解决的。一句话总结分布式锁是“防撞车”的交通灯让同一时间只有一辆车通过路口分布式事务是“修立交桥”确保从A点到B点的整个路线可能经过多个路口畅通且完整要么全通要么全封。
返回列表