Seata的AT、TCC、Saga模式的区别及适用场景?

article/2025/6/6 3:16:39

一、Seata 三种模式核心概念

1. AT 模式(Auto Transaction)
  • 技术本质:基于两阶段提交的自动补偿型事务
  • 特点:通过全局锁实现数据隔离,业务代码零侵入
  • 实现原理
    // 业务方法示例
    @GlobalTransactional // 全局事务注解
    public void purchase() {// 1. 扣减库存(自动生成反向SQL)inventoryService.reduce();// 2. 创建订单(自动生成反向SQL)orderService.create();
    }
    
2. TCC 模式(Try-Confirm-Cancel)
  • 技术本质:手动补偿型事务
  • 核心接口
    public interface TccService {@TwoPhaseBusinessAction(name = "prepare", commitMethod = "commit", rollbackMethod = "rollback")boolean prepare(BusinessActionContext actionContext); // Try阶段boolean commit(BusinessActionContext actionContext);  // Confirm阶段boolean rollback(BusinessActionContext actionContext);// Cancel阶段
    }
    
3. Saga 模式
  • 技术本质:长事务解决方案
  • 执行方式
    // Saga状态机配置示例
    StateMachineBuilder<State, Event> builder = StateMachineBuilderFactory.create(...);
    builder.externalTransition().from(State.WAIT_PAY).to(State.PAID).on(Event.PAY_SUCCESS).perform(doAction()); // 正向操作
    

二、模式对比与实践场景

维度AT 模式TCC 模式Saga 模式
一致性最终一致强一致最终一致
侵入性无侵入需要实现TCC接口需要定义补偿方法
适用场景传统数据库操作(库存扣减)金融交易(账户余额操作)长流程业务(旅行订单)
锁机制全局锁无锁无锁
回滚策略自动生成反向SQL手动实现Cancel逻辑事件驱动补偿

三、实战代码案例

案例1:AT模式库存扣减(完整实现)
// InventoryService.java
public class InventoryService {@Autowiredprivate JdbcTemplate jdbcTemplate;// 库存扣减操作public void reduce(String commodityCode, int count) {jdbcTemplate.update("update inventory set count = count - ? where code = ?", count, commodityCode);}
}// OrderService.java 
public class OrderService {@GlobalTransactional // 全局事务注解(核心控制点)public void createOrder(String userId, String commodityCode, int count) {// 生成订单记录jdbcTemplate.update("insert into orders(user_id,commodity_code,count) values(?,?,?)", userId, commodityCode, count);// 调用库存服务inventoryService.reduce(commodityCode, count);}
}
案例2:TCC模式转账交易
// AccountTccServiceImpl.java
@Service
public class AccountTccServiceImpl implements AccountTccService {@Override@Transactional@TwoPhaseBusinessAction(name = "prepareDeduct", commitMethod = "commit", rollbackMethod = "rollback")public boolean prepareDeduct(BusinessActionContext context, String accountNo, BigDecimal amount) {// Try阶段:冻结金额int update = jdbcTemplate.update("update account set frozen = frozen + ? where balance >= ? and account_no = ?", amount, amount, accountNo);return update > 0;}@Override@Transactionalpublic boolean commit(BusinessActionContext context) {// Confirm阶段:扣除冻结金额String accountNo = (String) context.getActionContext("accountNo");BigDecimal amount = (BigDecimal) context.getActionContext("amount");return jdbcTemplate.update("update account set balance = balance - ?, frozen = frozen - ? where account_no = ?",amount, amount, accountNo) > 0;}@Override@Transactionalpublic boolean rollback(BusinessActionContext context) {// Cancel阶段:释放冻结金额String accountNo = (String) context.getActionContext("accountNo");BigDecimal amount = (BigDecimal) context.getActionContext("amount");return jdbcTemplate.update("update account set frozen = frozen - ? where account_no = ?",amount, accountNo) > 0;}
}
案例3:Saga模式旅行订单(事件编排)
// HotelBookingSaga.java
@Service
public class HotelBookingSaga {@SagaStart // Saga事务起点public void bookHotel(String orderId) {// 1. 预订酒店hotelService.book(orderId);// 2. 预订机票(自动触发补偿)flightService.book(orderId);}// 补偿方法(命名规范:业务方法名 + Compensate)public void bookHotelCompensate(String orderId) {hotelService.cancel(orderId);flightService.cancel(orderId);}
}// FlightService.java
@Service
public class FlightService {@SagaService(compensate = "cancel")public void book(String orderId) {// 机票预订逻辑}public void cancel(String orderId) {// 机票取消逻辑}
}

四、配置要点(application.yml)

seata:enabled: trueapplication-id: order-servicetx-service-group: my_tx_groupservice:vgroup-mapping:my_tx_group: defaultenable-degrade: falsedisable-global-transaction: falseconfig:type: nacosnacos:server-addr: 127.0.0.1:8848registry:type: nacos

五、生产环境选型建议

  1. AT模式:适用于传统数据库操作(库存系统/订单系统),需注意全局锁性能影响
  2. TCC模式:金融支付核心系统(资金账户操作),要求强一致性
  3. Saga模式:跨境物流订单(多系统协作的长流程业务),可接受最终一致性

建议搭配使用:核心交易系统使用TCC保证强一致,普通业务系统使用AT提升开发效率,跨多系统的长流程业务使用Saga管理事务边界。


http://www.hkcw.cn/article/ZROlRsHWXZ.shtml

相关文章

LabVIEW磁悬浮轴承传感器故障识别

针对工业高端装备中主动磁悬浮轴承&#xff08;AMB&#xff09;的位移传感器故障检测需求&#xff0c;基于 LabVIEW 平台构建了一套高精度故障识别系统。通过集成品牌硬件与 LabVIEW 的信号处理能力&#xff0c;实现了传感器探头故障的实时监测与精准定位&#xff0c;解决了传统…

Qt开发:QThreadPool的介绍和使用

文章目录 一、QThreadPool 简介二、常用函数简介三、完整示例 一、QThreadPool 简介 QThreadPool 是 Qt 提供的用于高效管理线程资源的类。它通过线程池的方式管理和复用线程&#xff0c;适合处理大量、短时间运行的任务&#xff0c;避免频繁创建和销毁线程带来的性能开销。 常…

蚂蚁感冒--思维

1.相遇后不用考虑转头&#xff0c;继续走就可以 2.思维&#xff0c;不只是傻傻的模拟&#xff0c;要总结出规律&#xff0c;什么情况一定可以感染&#xff0c;然后感染之后再怎么这么样 P8611 [蓝桥杯 2014 省 AB] 蚂蚁感冒 - 洛谷 #include<bits/stdc.h> using names…

non-autoregressive sequence generation

非自回归non-autoregressive 传统rnn是autoregressive,而且encode和decode都是根据上一个input/output,这样花费的时间就和句子长度成正比 transformer的输入是并行的,但是decode阶段还是autoregressive 单纯把影像当成 NM 个独立像素去拟合&#xff0c;会缺乏像素之间的依赖…

实验设计与分析(第6版,Montgomery著,傅珏生译) 第10章拟合回归模型10.9节思考题10.1 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第10章拟合回归模型10.9节思考题10.1 R语言解题。主要涉及线性回归、回归的显著性、回归系数的置信区间。 vial <- seq(1, 10, 1) Viscosity <- c(160,171,175,182,184,181,188,19…

如何选择最高效的沟通方式?

日常沟通主要分为文字、语音和面对面三种形式&#xff0c;选择何种方式需根据沟通内容的复杂程度、决策难度及互动需求综合判断。 当沟通内容简单明确、以信息传递为主或涉及基础决策时&#xff0c;文字或语音是更高效的选择。这类方式不仅能降低时间成本&#xff0c;还能避免…

VueScan:全能扫描,高清输出

在数字化办公和图像处理的领域&#xff0c;扫描仪扮演着不可或缺的角色。无论是文档的数字化存档、照片的高清复制&#xff0c;还是创意项目的素材采集&#xff0c;一款性能卓越、操作便捷的扫描软件能大幅提升工作效率和成果质量。VueScan正是这样一款集多功能于一身的扫描仪软…

【Hot 100】279. 完全平方数

目录 引言完全平方数我的解题dp总结 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;算法专栏&#x1f4a5; 标题&#xff1a;【Hot 100】279. 完全平方数❣️ 寄语&#xff1a;书到用时方恨少&#xff0c;事非经过不知难&#xff01; 引言 今天又…

Alita:通过 MCP 实现自主进化的通用 AI 代理

Alita 是一个创新的通用 AI 代理&#xff0c;采用极简主义设计哲学&#xff0c;强调 minimal predefinition&#xff08;最小预定义&#xff09;和 maximal self-evolution&#xff08;最大自主进化&#xff09;。通过利用 Model Context Protocols (MCPs)&#xff0c;Alita 能…

关于物联网的基础知识(二)——物联网体系结构分层

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于物联网的基础知识&#xff08;二&a…

大语言模型评测体系全解析(上篇):基础框架与综合评测平台

文章目录 一、评测体系的历史演进与技术底座&#xff08;一&#xff09;发展历程&#xff1a;从单任务到全维度评测1. 2018年前&#xff1a;单数据集时代的萌芽2. 2019-2023年&#xff1a;多任务基准的爆发式增长3. 2024年至今&#xff1a;动态化、场景化、多模态体系成型关键节…

SpringAI系列 - MCP篇(三) - MCP Client Boot Starter

目录 一、Spring AI Mcp集成二、Spring AI MCP Client Stater三、spring-ai-starter-mcp-client-webflux集成示例3.1 maven依赖3.2 配置说明3.3 集成Tools四、通过SSE连接MCP Server五、通过STDIO连接MCP Server六、通过JSON文件配置STDIO连接一、Spring AI Mcp集成 Spring AI…

MyBatis 一级缓存与二级缓存

一、缓存概述 MyBatis 提供两级缓存机制提升查询性能&#xff1a; 一级缓存&#xff1a;SqlSession 级别&#xff0c;默认开启 二级缓存&#xff1a;Mapper 级别&#xff0c;需手动开启 两者协同工作&#xff0c;形成查询数据优先级&#xff1a;二级缓存 → 一级缓存 → 数据…

008房屋租赁系统技术揭秘:构建智能租赁服务生态

房屋租赁系统技术揭秘&#xff1a;构建智能租赁服务生态 在房地产租赁市场日益活跃的当下&#xff0c;房屋租赁系统成为连接房东与租客的重要数字化桥梁。该系统集成用户管理、房屋信息等多个核心模块&#xff0c;面向管理员、房东和用户三类角色&#xff0c;通过前台展示与后…

HTTP协议完全指南:从请求响应到HTTPS安全机制

文章目录 一、HTTP协议中的基本概念1.HTTP协议介绍&#xff08;1&#xff09;协议&#xff08;2&#xff09;传输&#xff08;3&#xff09;超文本 2.统一资源定位符&#xff08;URL&#xff09; 二、HTTP协议中的请求和响应1.HTTP客户端请求消息&#xff08;1&#xff09;请求…

第11节 Node.js 模块系统

为了让Node.js的文件可以相互调用&#xff0c;Node.js提供了一个简单的模块系统。 模块是Node.js 应用程序的基本组成部分&#xff0c;文件和模块是一一对应的。换言之&#xff0c;一个 Node.js 文件就是一个模块&#xff0c;这个文件可能是JavaScript 代码、JSON 或者编译过的…

『uniapp』把接口的内容下载为txt本地保存 / 读取本地保存的txt文件内容(详细图文注释)

目录 预览效果思路分析downloadTxt 方法readTxt 方法 完整代码总结 欢迎关注 『uniapp』 专栏&#xff0c;持续更新中 欢迎关注 『uniapp』 专栏&#xff0c;持续更新中 预览效果 思路分析 downloadTxt 方法 该方法主要完成两个任务&#xff1a; 下载 txt 文件&#xff1a;通…

XCTF-web-ics-05

看一下有什么 只有/index.php 模糊测试得到一个page ┌──(kali㉿kali)-[~] └─$ ffuf -u "http://223.112.5.141:52073/index.php?FUZZFUZZ" -w /usr/share/wordlists/rockyou.txt -fc 403 -c -fs 2305 -s page尝试用php伪协议读取源码?pagephp://filter/readc…

Redis线程模型

前面的文章介绍了Redis的底层数据结构&#xff0c;这篇文章来介绍一下Redis的线程模型。 Redis为什么选择单线程&#xff1f; 官方的回答是这样的&#xff0c;对于Redis来说&#xff0c;CPU通常不会成为瓶颈&#xff0c;因为大多数的请求不会是CPU密集型的&#xff0c;而是IO密…

工厂方法模式深度解析:从原理到应用实战

作者简介 我是摘星&#xff0c;一名全栈开发者&#xff0c;专注 Java后端开发、AI工程化 与 云计算架构 领域&#xff0c;擅长Python技术栈。热衷于探索前沿技术&#xff0c;包括大模型应用、云原生解决方案及自动化工具开发。日常深耕技术实践&#xff0c;乐于分享实战经验与…