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

TCC分布式事务代码

文章目录

  • 回滚链路
    • 1. 全局回滚是谁触发的?因为什么配置?
    • 2. TCC 的「Cancel / 回滚」对应哪些方法?因为什么配置?
    • 3. 串起来:一条「回滚链路」长什么样(概念上)
    • 4. 还需要哪些「环境配置」这条链路才完整?

main分支

https://gitee.com/he-weigang/distributed-transaction.git

一定要有分布式思想,抛弃单机思维

请求演示json可以导入到Postman里面处理

回滚链路


下面按「谁在决定回滚」和「方法级回滚链路」分开说,并对应到你仓库里的具体配置。

1. 全局回滚是谁触发的?因为什么配置?

入口在TccInvokerService.invokeTccTry上的:

@GlobalTransactional(name="create-order-tcc",rollbackFor=Exception.class)publicStringinvokeTccTry(StringcommodityCode,Integercount,BigDecimalprice,booleansimulateFailure){// ...}

含义简要说明:

  • @GlobalTransactional:这个方法在TM(事务管理器)眼里是全局事务边界。里面的远程调用 + 本地 TCC Try 都会在同一 XID 下注册分支。
  • rollbackFor = Exception.class:方法执行过程中只要抛出Exception及其子类(含RuntimeException),Seata 会走全局回滚(向 TC 报告失败,由 TC 协调各分支 Cancel)。

因此例如:

  • simulateFailure == true时主动throw new RuntimeException(...)触发全局回滚
  • 库存 HTTP Try 抛错、订单 Try 抛错等 →同样可能触发全局回滚(取决于异常是否冒泡出该全局事务方法)。

注意:这不是 Spring 的@Transactional在管分布式回滚,而是@GlobalTransactional+ Seata TM/TC;rollbackFor决定哪些异常会让 TM 选择去回滚全局事务。


2. TCC 的「Cancel / 回滚」对应哪些方法?因为什么配置?

每个参与 TCC 的 Bean 上都有:

@Transactional(rollbackFor=Exception.class)@TwoPhaseBusinessAction(name="orderTccAction",commitMethod="commit",rollbackMethod="rollback",useTCCFence=false)

库存侧同理:storageTccActioncommitMethod = "commit",rollbackMethod = "rollback"

含义:

  • @TwoPhaseBusinessAction:声明这是一个 TCC 资源;Seata 在Try(prepare)成功后会登记分支。
  • rollbackMethod = “rollback”:当全局事务被 TC 决定回滚时,Seata RM 会回调你类里的rollback(BusinessActionContext),这就是 TCC 的Cancel 阶段(业务上的「撤销 Try」)。
  • commitMethod = “commit”:全局提交时走 Confirm,和回滚链路无关。
  • 上面的@Transactional(rollbackFor = Exception.class)只管本方法内本地数据库事务:Cancel/Confirm 里若再抛异常,是本地 Spring 事务是否回滚,和「为何进入 Cancel」无关。

订单 Cancel 里再调到仓储:

  • OrderTccServiceImpl.rollbackOrderRepository.cancel(...)(把订单从 TRY 改成 CANCELLED)。

库存 Cancel:

  • StorageTccServiceImpl.rollback→ 解冻/回滚冻结逻辑(StorageRepository 里对应方法)。

分支回调顺序由 Seata TC 协调决定(不是你在 OrderService 里写好的调用顺序);你只在注解里声明了「回滚时调哪个方法」。


3. 串起来:一条「回滚链路」长什么样(概念上)

  1. TccInvokerService.invokeTccTry(带@GlobalTransactional)执行 Try 链路:
    orderTccService.prepare→ HTTP 调 storage 的/tcc/trystorageTccService.prepare
  2. 若在全局事务内抛出异常(满足rollbackFor) → TM 请求 TC 全局回滚。
  3. TC 通知已注册分支:执行 TCC Cancel →
    • 订单 RMOrderTccServiceImpl.rollbackOrderRepository.cancel
    • 库存 RMStorageTccServiceImpl.rollback→ 库存解冻等

所以你在createOrder/createOrderWithException里看不到cancel,是因为 Cancel 是阶段 2,由 Seata 在全局回滚时通过rollbackMethod调起,不是业务代码直接调用。


4. 还需要哪些「环境配置」这条链路才完整?

  • 客户端连上同一个 Seata TCregistry.conf/application.ymlseata.registry等),否则 TM/TC 无法协调,也就不会有规范的二阶段 Cancel。
  • XID 传播:订单侧RestTemplate的 Seata 拦截器把 XID 传到库存 HTTP;库存StorageController里对TX_XID/RootContext的处理,让库存 Try 落在同一全局事务里。

一句话总结:全局回滚由@GlobalTransactional(rollbackFor = Exception.class)在入口方法抛错时触发;各服务的业务回滚方法由@TwoPhaseBusinessAction(rollbackMethod = "rollback")指定,Seata 在全局回滚时回调rollback,再在方法内部执行你写的cancel/解冻等逻辑。

http://www.jsqmd.com/news/669073/

相关文章:

  • C语言:数组名的理解(size of 和strlen示例)
  • vector模拟实现
  • 保姆级教程:用华为ENSP模拟器搞定企业级有线无线网络(含S5700/AC6605配置)
  • Python学习-数据结构与算法02
  • API的基础讲解
  • CTF SHOW WEB 4(无法查看源代码)
  • 【仅限首批200名AI架构师】:获取AGI融合系统故障诊断矩阵(含17类典型冲突模式+动态权重调优公式)
  • 抓包方案分享
  • 手把手教你:在UVM验证环境中安全使用disable fork管理并发线程
  • 当代码几乎免费时,程序员还剩下什么?
  • 基于springboot的加油站销售积分管理系统的设计与实
  • AI Agent的感知世界:多模态输入处理
  • AGI与机器人结合不是“加法”,而是“范式熔断”——SITS2026提出全新评估矩阵(含6维动态权重算法)
  • 手把手教你用CAPL脚本监控CANoe环境变量变化,实现自动化测试联动
  • C语言分支循环语句:第二篇:循环语句
  • 世界模型是人机环境系统智能的子集吗?
  • HC32F460驱动ILI9341并口屏:从SPI到16位并口的提速实战与emWin移植避坑
  • AGI游戏智能落地失败率高达67%?SITS2026专家团复盘11个真实项目,提炼出2个关键决策阈值与1个不可逆拐点
  • Netty 编解码器学习记:从粘包拆包到自定义协议
  • JAVA语法合集之(六):活用数组
  • 2026年评价高的天津预应力混凝土屋面板品牌厂家推荐 - 品牌宣传支持者
  • 数据结构面试题避坑指南:别再被这些‘送分题’骗了(附详细解析)
  • 半马:机器人已超过人类
  • 终极指南:专业级AMD Ryzen调试工具SMUDebugTool深度解析与实战应用
  • 2026届必备的五大AI辅助论文助手解析与推荐
  • 项目实训(一)|中医智能诊疗系统后端基础架构搭建与环境配置
  • 2026年3月评价好的除铁器公司口碑推荐,电磁悬挂除铁器/全自动永磁悬挂除铁器/永磁筒磁选机/电磁铁,除铁器厂家有哪些 - 品牌推荐师
  • 协作的“语法”:多 Agent 系统的编排
  • 别只背课文了!用Python爬虫+AI工具,高效复习《新概念英语三》Lesson 16-20
  • 智能客服的终局:从关键词匹配到能够处理复杂售后的全能 Agent