Jorgen's blog Jorgen's blog
首页
  • 平台架构
  • 混合式开发记录
  • 推送服务
  • 数据分析
  • 实时调度
  • 架构思想

    • 分布式
  • 编程框架工具

    • 编程语言
    • 框架
    • 开发工具
  • 数据存储与处理

    • 数据库
    • 大数据
  • 消息、缓存与搜索

    • 消息队列
    • 搜索与日志分析
  • 前端与跨端开发

    • 前端技术
    • Android
  • 系统与运维

    • 操作系统
    • 容器化与 DevOps
  • 物联网与安全

    • 通信协议
    • 安全
    • 云平台
newland
  • 关于我
  • 终身学习
  • 关于时间的感悟
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

jorgen

Love it, make mistakes, learn, keep grinding.
首页
  • 平台架构
  • 混合式开发记录
  • 推送服务
  • 数据分析
  • 实时调度
  • 架构思想

    • 分布式
  • 编程框架工具

    • 编程语言
    • 框架
    • 开发工具
  • 数据存储与处理

    • 数据库
    • 大数据
  • 消息、缓存与搜索

    • 消息队列
    • 搜索与日志分析
  • 前端与跨端开发

    • 前端技术
    • Android
  • 系统与运维

    • 操作系统
    • 容器化与 DevOps
  • 物联网与安全

    • 通信协议
    • 安全
    • 云平台
newland
  • 关于我
  • 终身学习
  • 关于时间的感悟
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • CAP & BASE理论
  • Raft算法:理解分布式共识
  • 分布式一致性协议:Paxos与Raft
  • 分布式一致性协议:Paxos与Raft算法详解
  • 分布式一致性协议:Raft算法详解
  • 分布式一致性协议:从理论到实践
  • 分布式一致性算法:Paxos与Raft详解
  • 分布式一致性算法:Raft详解
  • 分布式一致性算法:从Paxos到Raft
  • 分布式一致性算法:从理论到实践
  • 分布式共识算法:Raft详解
  • 分布式系统的一致性协议:Paxos与Raft
  • 深入理解Raft一致性算法
  • 分布式一致性协议-ZAB详解
  • 分布式事务:从理论到实践
    • 前言
    • 分布式事务的挑战
    • 分布式事务解决方案
      • 1. 两阶段提交(2PC)
      • 准备阶段
      • 提交阶段
      • 2. 三阶段提交(3PC)
      • 3. TCC模式
      • 4. Saga模式
      • 5. 本地消息表方案
    • 实际应用场景选择
    • 结语
  • 分布式系统的容错机制与故障恢复
  • 拜占庭将军问题与PBFT算法详解
  • 分布式锁:原理、实现与实战
  • 分布式Gossip协议:原理、应用与实现
  • 分布式系统中的时钟问题:从物理时钟到逻辑时钟
  • 分布式系统的负载均衡:原理、算法与实践
  • 分布式系统中的服务发现:原理、实现与实践
  • 分布式数据分区与分片策略:构建可扩展系统的基石
  • 分布式追踪-原理、技术与实践
  • 分布式消息队列-原理、实现与应用
  • 分布式缓存-原理-策略与实践
  • 分布式系统中的安全机制-构建可信的分布式环境
  • 分布式协调服务-ZooKeeper与etcd详解
  • 分布式系统的容错与故障检测机制
  • 分布式系统的状态管理-策略-模型与实践
  • distributed_system
Jorgen
2023-11-15
目录

分布式事务:从理论到实践

# 前言

在分布式系统中,我们常常面临一个核心挑战:如何保证跨多个服务或数据库的数据一致性。当我们讨论分布式一致性时,很多人会立即想到Paxos、Raft或ZAB这类一致性协议。这些协议确实解决了副本间的数据一致性问题,但它们并不能完全解决分布式系统中的所有一致性问题。

特别是在实际业务场景中,我们经常需要处理跨多个独立数据源的事务操作。例如,一个电商订单创建流程可能涉及库存扣减、订单创建、优惠券使用等多个独立的数据操作。如何保证这些操作要么全部成功,要么全部失败?这就是分布式事务要解决的问题。

提示

分布式事务是指事务的参与者、资源服务器、事务管理器等分别位于不同的分布式节点之上的事务。它需要保证这些节点间的数据一致性和操作的原子性。

# 分布式事务的挑战

与单机事务相比,分布式事务面临更多挑战:

  1. 网络问题:节点间通信可能失败、延迟或重复
  2. 节点故障:部分节点可能宕机或网络分区
  3. 时钟漂移:不同节点的时钟可能不完全同步
  4. 性能瓶颈:协调多个节点会增加系统延迟
  5. 复杂度增加:系统架构变得更加复杂,难以调试和维护

# 分布式事务解决方案

目前业界主要有以下几种分布式事务解决方案:

# 1. 两阶段提交(2PC)

2PC是最经典的分布式事务协议,分为准备阶段和提交阶段。

# 准备阶段

  1. 事务协调者向所有参与者发送准备请求
  2. 参与者执行事务操作,但不提交,并将undo和redo日志写入持久化存储
  3. 参与者向协调者反馈是否可以提交

# 提交阶段

  • 如果所有参与者都反馈可以提交:
    1. 协调者向所有参与者发送提交命令
    2. 参与者提交事务并释放资源
    3. 参与者向协调者反馈提交结果
  • 如果有参与者反馈不能提交或超时:
    1. 协调者向所有参与者发送回滚命令
    2. 参与者执行回滚操作并释放资源
    3. 参与者向协调者反馈回滚结果

优点:

  • 实现简单,原理清晰
  • 能够严格保证事务的ACID特性

缺点:

  • 同步阻塞问题:在准备阶段后,参与者会锁定资源
  • 单点故障问题:协调者宕机可能导致系统阻塞
  • 数据不一致风险:如果协调者在提交阶段后宕机,部分参与者可能提交,部分可能回滚

# 2. 三阶段提交(3PC)

3PC是2PC的改进版本,通过引入预提交阶段来减少同步阻塞问题。

  1. CanCommit阶段:协调者询问参与者是否可以提交
  2. PreCommit阶段:协调者根据反馈决定是否进入预提交
  3. DoCommit阶段:与2PC的提交阶段类似

优点:

  • 减少了同步阻塞的可能性
  • 单点问题影响较小

缺点:

  • 性能较差,增加了一轮通信
  • 仍然存在数据不一致的可能性

# 3. TCC模式

TCC(Try-Confirm-Cancel)是一种补偿性事务模式,将一个大事务拆分为三个小操作:

  1. Try阶段:尝试执行业务操作,预留资源
  2. Confirm阶段:确认执行业务操作,执行真正的业务逻辑
  3. Cancel阶段:取消执行业务操作,释放预留的资源

示例:转账场景

  • Try:冻结账户A和账户B的资金
  • Confirm:从账户A扣除资金,添加到账户B
  • Cancel:解冻账户A和账户B的资金

优点:

  • 最终一致性,性能较好
  • 可以适应长事务场景

缺点:

  • 业务侵入性强,需要业务逻辑支持
  • 确认和取消操作需要幂等性设计
  • 开发成本高

# 4. Saga模式

Saga模式将长事务拆分为多个本地事务,每个本地事务都有一个对应的补偿事务。

有两种实现方式:

  1. 协调式Saga:由协调者按照顺序调用本地事务,如果某个事务失败,则按相反顺序调用补偿事务
  2. 事件式Saga:通过事件驱动,每个本地事务完成后发布事件,触发下一个事务

优点:

  • 最终一致性,性能较好
  • 业务侵入性相对较低

缺点:

  • 不保证隔离性
  • 补偿逻辑设计复杂
  • 可能出现脏回滚问题

# 5. 本地消息表方案

本地消息表方案基于本地事务+消息队列实现分布式事务:

  1. 在本地数据库中创建消息表
  2. 业务操作和消息记录在同一个本地事务中完成
  3. 通过定时任务将消息发送到消息队列
  4. 消费者消费消息并执行相应操作
  5. 消费完成后更新消息状态

优点:

  • 实现相对简单
  • 性能较好,系统解耦

缺点:

  • 不保证强一致性
  • 需要额外实现消息状态管理

# 实际应用场景选择

不同的分布式事务解决方案适用于不同的场景:

方案 一致性 性能 开发复杂度 适用场景
2PC 强一致性 低 中 对一致性要求高,性能要求低的场景
TCC 最终一致性 中 高 一致性要求较高,业务逻辑可拆分的场景
Saga 最终一致性 高 中 业务流程长,对性能要求高的场景
本地消息表 最终一致性 高 低 可接受短暂不一致,追求高吞吐量的场景

# 结语

分布式事务是分布式系统中不可避免的话题,没有一种方案能够完美解决所有问题。在实际应用中,我们需要根据业务需求、性能要求和系统架构选择合适的解决方案。

随着微服务架构的普及,分布式事务的重要性日益凸显。理解各种分布式事务方案的原理和优缺点,有助于我们在系统设计时做出更合理的决策。

最终,技术选型没有绝对的对错,只有是否适合。在分布式系统设计中,我们需要在一致性、可用性和分区容错性之间找到平衡点。

— Jorgen

#分布式事务#一致性#2PC#TCC#Saga
上次更新: 2026/01/28, 10:42:53
分布式一致性协议-ZAB详解
分布式系统的容错机制与故障恢复

← 分布式一致性协议-ZAB详解 分布式系统的容错机制与故障恢复→

最近更新
01
LLM
01-30
02
intro
01-30
03
intro
01-30
更多文章>
Theme by Vdoing | Copyright © 2019-2026 Jorgen | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式