当前位置: 首页 > news >正文

详解Seata的四种事务模式:AT、TCC、SAGA、XA

一、AT 模式(Auto Transaction - 默认模式

核心原理:

        基于 SQL 解析的自动补偿机制,通过代理数据源实现业务无侵入。

工作流程:

 关键特性:

  • 自动生成补偿

    • 前置镜像(Before Image):记录 SQL 执行前的数据状态。

    • 后置镜像(After Image):记录 SQL 执行后的数据状态。

      /* 前置镜像 */
      SELECT * FROM account WHERE id=1 FOR UPDATE;/* 业务操作 */
      UPDATE account SET balance=90 WHERE id=1;/* 后置镜像 */
      SELECT * FROM account WHERE id=1;
  • 全局锁机制

    • 在 TC 中维护行级锁。

    • 防止其他事务修改正在操作的数据。

适用场景:

  • 常规业务系统(电商、CRM等)。

  • 需要快速接入分布式事务的场景。

  • 对业务代码无侵入要求的项目。

二、TCC 模式(Try-Confirm-Cancel)

核心原理:

        人工编码的柔性事务,通过三个阶段实现最终一致性。

三阶段定义:

阶段职责特性
Try资源预留(冻结资金、占库存)可失败、可重试
Confirm确认操作(实际扣款、减库存)必须成功、幂等
Cancel取消操作(解冻资金、释库存)必须成功、幂等

工作流程:

 代码实现示例:

// 账户服务接口
public interface AccountService {@TwoPhaseBusinessAction(name = "deduct", commitMethod = "confirm", rollbackMethod = "cancel")boolean tryDeduct(BusinessActionContext context, @BusinessActionContextParameter(paramName = "userId") String userId,@BusinessActionContextParameter(paramName = "amount") BigDecimal amount);boolean confirm(BusinessActionContext context);boolean cancel(BusinessActionContext context);
}// 实现类
@Service
public class AccountServiceImpl implements AccountService {@Transactionalpublic boolean tryDeduct(BusinessActionContext context, String userId, BigDecimal amount) {// 检查余额// 冻结资金(生成冻结记录)accountDao.freeze(userId, amount);}public boolean confirm(BusinessActionContext context) {// 获取冻结金额BigDecimal amount = (BigDecimal)context.getActionContext("amount");// 实际扣除冻结资金accountDao.deductFrozen(userId, amount);}public boolean cancel(BusinessActionContext context) {// 释放冻结资金accountDao.unfreeze(userId, amount);}
}

设计要点:

  • 幂等控制

    • 通过事务上下文(XID + Branch ID)确保操作幂等。

  • 空回滚防护

    • 检查 Try 是否已执行。

  • 悬挂处理

    • Cancel 比 Try 先到时拒绝执行。

适用场景:

  • 金融支付系统。

  • 需要精准控制事务流程的业务。

  • 高并发资金操作(如红包系统)。

三、SAGA 模式

核心原理:

        长事务解决方案,通过事务编排 + 补偿服务实现最终一致性

两种实现方式:

类型实现方式特点
状态机基于配置的状态转移可视化编排、集中管理
注解驱动@SagaService注解代码集成、灵活性高

 状态机配置示例:

{"name": "orderSaga","steps": [{"name": "reduceInventory","service": "inventoryService","compensate": "compensateInventory"},{"name": "deductBalance","service": "accountService","compensate": "compensateDeduction"}],"failurePolicy": "forward" // 补偿策略
}

补偿策略:

策略执行方式适用场景
正向恢复重试失败步骤临时性错误(网络抖动)
逆向恢复执行所有补偿操作业务逻辑错误
自定义策略根据错误类型选择策略复杂业务场景

工作流程:

 适用场景:

  • 跨系统业务流程(订单→物流→支付)。

  • 长时间运行的事务(保险理赔、贷款审批)。

  • 遗留系统改造(不需要全局事务支持)。

四、XA 模式

核心原理:

        基于数据库原生XA协议,实现强一致性分布式事务。

两阶段提交:

阶段操作资源状态
Prepare所有参与者执行事务但不提交锁定资源
Commit协调者通知所有参与者提交事务释放锁,持久化

 代码示例:

@GlobalTransactional(type = GlobalTransactionType.XA)
public void xaTransaction() {jdbcTemplateXA1.execute("UPDATE account SET balance=90 WHERE id=1");jdbcTemplateXA2.execute("INSERT INTO log(user_id,action) VALUES(1,'payment')");
}

关键配置:

# 启用XA模式
seata.data-source-proxy-mode=XA
# 超时设置(秒)
seata.tx-service.xa.timeout=30

适用场景:

  • 传统数据库迁移到分布式架构。

  • 需要强一致性的核心系统(银行核心)。

  • 已有支持XA协议的数据库系统。

五、模式选择决策树

六、混合模式实战案例

电商订单系统

  • 主流事务(AT模式)

    @GlobalTransactional
    public void createOrder(OrderDTO order) {// AT模式操作inventoryService.deductStock(order); accountService.deductBalance(order);// TCC模式操作(积分服务)pointsService.addPoints(order.getUserId(), order.getPoints());// 本地事务orderDAO.create(order);
    }
  • 积分服务(TCC模式)

    @TwoPhaseBusinessAction(name = "addPoints")
    public boolean tryAddPoints(BusinessActionContext context, @BusinessActionContextParameter("userId") Long userId,@BusinessActionContextParameter("points") Integer points) {// 预加积分(生成预加记录)
    }

 七、性能对比

指标AT模式TCC模式SAGA模式XA模式
吞吐量10,000 TPS8,000 TPS7,000 TPS2,000 TPS
平均延迟50ms80ms100ms+200ms+
锁持有时间极短(本地提交后释放)中等(Confirm前)长(整个事务周期)长(两阶段结束)
数据一致性最终一致最终一致最终一致强一致
业务侵入性

 八、选型建议

  • 首选 AT 模式

    • 新项目快速接入

    • 常规业务场景

    • 开发资源有限的项目

  • 考虑 TCC 模式

    • 金融核心系统

    • 需要精确控制事务流程

    • 高并发资金操作

  • 选择 SAGA 模式

    • 跨企业服务调用

    • 长周期业务流程

    • 遗留系统集成

  • 使用 XA 模式

    • 强一致性要求的系统

    • 已有XA基础设施

    • 数据库支持XA协议

重要提示:生产环境建议结合 Sentinel 或 Hystrix 实现事务熔断,防止雪崩效应。对于金融级场景,建议采用 TCC+AT 混合模式,关键资金操作使用TCC,辅助操作使用AT。

http://www.xdnf.cn/news/737821.html

相关文章:

  • 深入浅出网络分析与故障检测工具
  • Chrome插件学习笔记(二)
  • C++核心编程_赋值运算符重载
  • 2025最新Nginx安装配置保姆级教程(Windows)
  • 《JavaScript高级程序设计》读书笔记 34 - 代理基础
  • 【术语扫盲】BSP与MSP
  • FreeRTOS多任务系统①
  • Vector - VT System - 板卡_VT板卡使用介绍目录
  • 【Redis】hash
  • LevelDB、BoltDB 和 RocksDB区块链应用比较
  • 前端基础之《Vue(17)—路由集成》
  • 【C/C++】无限长有序数组中查找特定元素
  • 语音通信接通率、应答率和转化率有什么区别?
  • (20)Java 在 AI ML 领域应用
  • Spring AI开发跃迁指南(第二章:急速上手5——Spring AI 结构化输出源码级原理详解及使用实例)
  • 电动飞行器(eVTOL)动力测试实验室系统方案
  • JavaScript正则表达式
  • 精通 Kubernetes:从故障排除到化繁为简
  • MySql--定义表存储引擎、字符集和排序规则
  • 前端面试题目-高频问题集合
  • 用OLEDB读取EXCEL时,单元格内容长度超过255被截断
  • 痉挛性斜颈相关内容说明
  • 换行符在markdown格式时异常2
  • 智能化能源管理系统在“双碳”背景下的新价值
  • 本地部署Ollama DeepSeek-R1:8B,接入Cherry Studio
  • 优先队列用法
  • [正点原子]ESP32S3 RGB屏幕移植LVGL
  • 基本数据指针的解读-C++
  • 数据即资产:GEO如何重塑企业的信息价值链
  • 电子电路:D触发器的工作原理及应用详解