Seata分布式事务:核心概念与事务模式详解

一、分布式事务基础

1. 什么是分布式事务?

定义:分布式事务是指跨越多个服务或数据库的事务操作,需要保证这些操作要么全部成功,要么全部失败。

典型问题

  • 数据一致性(CAP理论):在分布式系统中,无法同时满足一致性、可用性和分区容错性
  • 隔离性:多个事务并发执行时的可见性问题
  • 原子性:跨服务的操作无法通过本地事务保证

图1

实践建议

  • 评估是否真的需要分布式事务,能避免则避免
  • 根据业务场景选择合适的一致性级别(强一致/最终一致)

二、Seata核心介绍

1. Seata是什么?

定位:开源的分布式事务解决方案,前身为阿里中间件团队开发的Fescar(2019年更名为Seata)

核心优势

  • 高性能:通过优化两阶段提交协议减少性能损耗
  • 易用性:与主流框架(Spring Cloud、Dubbo)无缝集成
  • 低侵入:AT模式下几乎零代码改造

版本演进

2019.01 - Fescar 1.0发布
2019.06 - 更名为Seata
2020.03 - 支持TCC模式
2021.12 - 2.0架构重大升级

三、Seata事务模式详解

1. AT模式(自动补偿型)

原理

  1. 解析业务SQL生成前后镜像
  2. 本地事务提交前记录undo_log
  3. 全局事务失败时自动补偿
// 使用示例
@GlobalTransactional
public void purchase() {
    orderService.create();
    storageService.deduct();
}

适用场景

  • 基于关系型数据库的业务
  • 希望最小化代码改造的场景

实践建议

  • 确保业务表有主键
  • undo_log表需要与业务数据同库

2. TCC模式(两阶段编码型)

三阶段流程

  1. Try:预留资源
  2. Confirm:确认执行
  3. Cancel:取消释放
@LocalTCC
public interface AccountService {
    @TwoPhaseBusinessAction(name = "deduct", commitMethod = "confirm", rollbackMethod = "cancel")
    boolean tryDeduct(BusinessActionContext context, String userId, double money);
    
    boolean confirm(BusinessActionContext context);
    boolean cancel(BusinessActionContext context);
}

适用场景

  • 需要精细控制事务边界的业务
  • 非关系型数据库操作

实践建议

  • 必须实现幂等性
  • 考虑空回滚和悬挂问题

3. SAGA模式

特点

  • 长事务解决方案
  • 每个正向服务需对应补偿服务
// 状态机配置示例
{
  "name": "purchaseFlow",
  "steps": [
    {
      "name": "createOrder",
      "compensate": "cancelOrder"
    },
    {
      "name": "deductStock",
      "compensate": "restoreStock"
    }
  ]
}

适用场景

  • 业务流程长(分钟/小时级)
  • 无法实现TCC的资源预留

4. XA模式

传统两阶段提交

  1. 准备阶段(Prepare)
  2. 提交/回滚阶段(Commit/Rollback)

与AT模式对比

特性XAAT
锁范围行锁全局锁
性能较低较高
侵入性

四、模式选型指南

图2

决策因素

  1. 一致性要求:强一致选AT/TCC,最终一致可选SAGA
  2. 性能需求:AT性能最好,XA最差
  3. 技术栈:非关系型数据库只能选TCC/SAGA

五、常见问题解决方案

  1. 全局锁冲突

    • 优化方案:减小事务粒度,缩短持有锁时间
    • 配置项:client.lock.retryInterval=10ms
  2. undo_log堆积

    • 定期清理脚本:

      DELETE FROM undo_log WHERE log_created < DATE_SUB(NOW(), INTERVAL 7 DAY);
  3. 调试技巧

    • 日志中搜索XID(全局事务ID)追踪完整链路
    • 使用Seata Admin控制台查询事务状态

总结

Seata作为分布式事务解决方案,提供了多种模式适应不同场景。理解各模式原理和适用条件是正确选型的关键。建议从AT模式开始尝试,随着业务复杂度提升再逐步评估是否需要TCC或SAGA模式。

评论已关闭