TCC分布式事务代码

张开发
2026/4/20 2:47:36 15 分钟阅读

分享文章

TCC分布式事务代码
文章目录回滚链路1. 全局回滚是谁触发的因为什么配置2. TCC 的「Cancel / 回滚」对应哪些方法因为什么配置3. 串起来一条「回滚链路」长什么样概念上4. 还需要哪些「环境配置」这条链路才完整main分支https://gitee.com/he-weigang/distributed-transaction.git一定要有分布式思想,抛弃单机思维请求演示json可以导入到Postman里面处理回滚链路下面按「谁在决定回滚」和「方法级回滚链路」分开说并对应到你仓库里的具体配置。1. 全局回滚是谁触发的因为什么配置入口在TccInvokerService.invokeTccTry上的GlobalTransactional(namecreate-order-tcc,rollbackForException.class)publicStringinvokeTccTry(StringcommodityCode,Integercount,BigDecimalprice,booleansimulateFailure){// ...}含义简要说明GlobalTransactional这个方法在TM事务管理器眼里是全局事务边界。里面的远程调用 本地 TCC Try 都会在同一 XID 下注册分支。rollbackFor Exception.class方法执行过程中只要抛出Exception及其子类含RuntimeExceptionSeata 会走全局回滚向 TC 报告失败由 TC 协调各分支 Cancel。因此例如simulateFailure true时主动throw new RuntimeException(...)→触发全局回滚库存 HTTP Try 抛错、订单 Try 抛错等 →同样可能触发全局回滚取决于异常是否冒泡出该全局事务方法。注意这不是 Spring 的Transactional在管分布式回滚而是GlobalTransactional Seata TM/TCrollbackFor决定哪些异常会让 TM 选择去回滚全局事务。2. TCC 的「Cancel / 回滚」对应哪些方法因为什么配置每个参与 TCC 的 Bean 上都有Transactional(rollbackForException.class)TwoPhaseBusinessAction(nameorderTccAction,commitMethodcommit,rollbackMethodrollback,useTCCFencefalse)库存侧同理storageTccActioncommitMethod commit,rollbackMethod rollback。含义TwoPhaseBusinessAction声明这是一个 TCC 资源Seata 在Tryprepare成功后会登记分支。rollbackMethod “rollback”当全局事务被 TC 决定回滚时Seata RM 会回调你类里的rollback(BusinessActionContext)这就是 TCC 的Cancel 阶段业务上的「撤销 Try」。commitMethod “commit”全局提交时走 Confirm和回滚链路无关。上面的Transactional(rollbackFor Exception.class)只管本方法内本地数据库事务Cancel/Confirm 里若再抛异常是本地 Spring 事务是否回滚和「为何进入 Cancel」无关。订单 Cancel 里再调到仓储OrderTccServiceImpl.rollback→OrderRepository.cancel(...)把订单从 TRY 改成 CANCELLED。库存 CancelStorageTccServiceImpl.rollback→ 解冻/回滚冻结逻辑StorageRepository 里对应方法。分支回调顺序由 Seata TC 协调决定不是你在 OrderService 里写好的调用顺序你只在注解里声明了「回滚时调哪个方法」。3. 串起来一条「回滚链路」长什么样概念上TccInvokerService.invokeTccTry带GlobalTransactional执行 Try 链路orderTccService.prepare→ HTTP 调 storage 的/tcc/try→storageTccService.prepare。若在全局事务内抛出异常满足rollbackFor → TM 请求 TC 全局回滚。TC 通知已注册分支执行 TCC Cancel →订单 RMOrderTccServiceImpl.rollback→OrderRepository.cancel库存 RMStorageTccServiceImpl.rollback→ 库存解冻等所以你在createOrder/createOrderWithException里看不到cancel是因为 Cancel 是阶段 2由 Seata 在全局回滚时通过rollbackMethod调起不是业务代码直接调用。4. 还需要哪些「环境配置」这条链路才完整客户端连上同一个 Seata TCregistry.conf/application.yml里seata.registry等否则 TM/TC 无法协调也就不会有规范的二阶段 Cancel。XID 传播订单侧RestTemplate的 Seata 拦截器把 XID 传到库存 HTTP库存StorageController里对TX_XID/RootContext的处理让库存 Try 落在同一全局事务里。一句话总结全局回滚由GlobalTransactional(rollbackFor Exception.class)在入口方法抛错时触发各服务的业务回滚方法由TwoPhaseBusinessAction(rollbackMethod rollback)指定Seata 在全局回滚时回调rollback再在方法内部执行你写的cancel/解冻等逻辑。

更多文章