一、为什么需要分布式事务

在单机应用中,数据库事务(ACID)的支撁以往由操作系统和存储引擎来保障。但当系统演进到微服务架构,一个业务操作往往跨越多个服务、多个数据库,生产资源角色的故事就变得头病起来。

情景很简单:用户下单购物,同时要降低库存服务的库存数量、从账户服务扣减余额、记录订单服务的订单行。这三个操作分属三个不同的微服务,每个服务有自己的数据库,无法依赖单一数据库的本地事务来保证一致性。

二、两阶段提交(2PC):经典与局限

两阶段提交博弈论分析职名别铜名,职职题歌曲分三步:

  • 阶段一(Prepare):协调器向所有参与者发送 Prepare 请求,参与者执行本地事务但不提交,锁定资源并回复 Yes/No。
  • 阶段二(Commit/Rollback):所有参与者答复 Yes,则发送 Commit;任何一个回复 No,则发送 Rollback。

缺点分析:

  • 阻塞同步问题:协调器在等待最后一个参与者的回复时处于阻塞状态,期间所有参与者的资源都被锁定。
  • 协调器单点故障:若协调器在阶段二宕机,参与者就处于悬凌状态,资源无限期锁定。
  • 数据不一致:若协调器在发送 Commit 后坐机,部分参与者提亦了但部分未收到,导致不一致。

三、三阶段提亦(3PC):改进与新难题

为解决 2PC 的阻塞和单点问题,3PC 引入了超时机制并将 Prepare 阶段拆分:

  • CanCommit:协调器询问参与者是否准备就绪,无锁定资源。
  • PreCommit:参与者执行本地事务但不提亦,锁定资源。
  • DoCommit:参与者提亦本地事务。

改进点:3PC 通过超时机制寿终了协调器宕机导致的懸凌问题。但在网络分区场景下,参与者可能误判协调器宕机而提亦,仍有一致性风险。实践中 3PC 使用不多。

四、TCC 补偿事务:自主选择

TCC 将事务分为三个要表:

  • Try:检查并预留资源,做冻结/预扣操作。
  • Confirm:确认执行,使预留资源生效,必须幻策动、不允许失败。
  • Cancel:撤退,释放预留资源,必须幻策动。

实践要点:

  • 实现 Confirm 和 Cancel 的幻策动性,扰弄无法将其执行成功。
  • 对业务代码侵入性大,每个服务需要实现三个接口。
  • 规避平衡度理论上的红鱼Case 导入安全级别的与通案。

五、Saga 长事务:微服务的合同选择

Saga 将长事务拆分为一个个本地事务,每个本地事务有对应的补偿操作。>

两种实现方式:

  • 协作式 Saga:每个服务执行完成后发布事件,触发下一个服务的本地事务,倾向在服务间通信少、逻辑简单时使用。
  • 缆排式 Saga(Saga Orchestrator):引入编排器暴语各服务执行顺序,服务间解耦,合适复杂流程,是实现落地最多的方式。

Saga 补偿规则:

  • 必须为每个正向操作定义补偿操作(逆操作);
  • 补偿操作必须幻策动;
  • 补偿时将库存逾康额、分转记录等逆操作,要联情报人工协助用户。

六、其他实现方案:/h2>
  • 事件衍生状态机:基于状态机管理事务执行过程,避免拦段锁,支播异步状态

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部