type
status
date
slug
summary
tags
category
icon
password
原文
源码地址:
Distributed_transactions_exmaple
newrain-zh • Updated Sep 19, 2025
整体流程示例
business 入口
-> stock 扣减库存
-> order 创建订单 -> account 扣减余额
business 服务
提供用户订购商品API。该接口向库存服务、订单服务发起远程调用。
TCC事务的入口,开启全局事务接口。
测试入口 → http://localhost:8086/purchase?rollback=true
stock服务
提供库存扣减API。
MySQL表:
stock_tbl
(库存表)、stock_freeze
(冻结库存记录表)StockTccService
接口reduce: 检查库存并冻结库存 (try阶段)
confirm: 冻结库存清零、更改冻结记录状态。
cancel: 恢复冻结库存,冻结记录修改
account 服务
提供账户扣减 API。
MySQL表:
account_tbl
、 account_freeze_record
IAccountService
接口:tryDeduct: 扣减账户余额,冻结余额(try 阶段)
confirm: 更改账户冻结记录的状态
cancel: 更改账户冻结记录状态、冻结金额清零
order服务
提供创建订单 API。
MySQL表:
order_tbl
OrderService
接口create: 创建订单,远程调用账户服务扣减账户金额。
commit:
cancel:

编写TCC 服务接口
TCC 是分布式事务中的二阶段提交协议,它的全称为 Try-Confirm-Cancel,即资源预留(Try)、确认操作(Confirm)、取消操作(Cancel)。
TTC 事务开启入口
bussiness服务订购商品接口开启全局事务。
TTC事务接口
在接口上添加注解
@
LocalTCC
,定义 TTC 接口,官方文档中标注该注解一定要标注在接口上。接口中定义三个方法对应 try、confirm、cancel 来对应各个阶段需调用的方法。
@TwoPhaseBusinessAction
- 标识 try 阶段执行的方法,该注解需要定义在接口方法上,定义实现类的方法上调用时会报错
- name为事务名称,需唯一。 commitMethod、rollbackMethod 对应接口中定义的 commit、rollback 阶段的方法。
seata
会根据全局事务的的成功或失败,自动调用对应的提交或回滚。
try 阶段接口
try接口实现
@BusinessActionContextParameter
用于将参数传递到二阶段,commitMethod、rollbackMethod 方法。
二阶段执行时,可以自行从BusinessActionContext 上获取。
假如TCC服务宕机了,重启后依然能从BusinessActionContext中能获取一阶段使用
@
BusinessActionContextParameter
注解的参数。BusinessActionContext TCC 事务上下文
事务上下文存储了全局事务的相关信息。
try 阶段的注解放入的参数
"commodityCode" : "C00321",
"count" : 2,
关于状态
可以通过
MySQL
表或BusinessActionContext
来保存状态,主要是 xid 。try 阶段状态可以,可以通过参数传递
BusinessActionContext
来维护整个事务过程中数据的一致性。confirm 、 cancel 阶段可以通过表或
BusinessActionContext
中来获取数据来,进行补偿和提交动作。虽然 try、 confirm 、 cancel 为本地方法,try 先执行,confirm 、 cancel后执行且并不是由 try方法来发起调用的,而是由
Seata
服务来调用,所以try向后传递只能依靠数据库和事务上下文来或其他方式。但是要保证服务宕机或重启,在 TC 服务继续发起调用时能够保证全局事务数据的一致性。例如:商品库存服务扣减接口 在 try 阶段冻结库存,confirm 、 cancel阶段需要知道 xid 、 商品编号或 id和数量,以便完成全局事务数据的一致性。
幂等
二阶段执行 cancel 、 confirm时,服务宕机、网络抖动或代码问题等问题,TC会重复发起调用,直到二阶段执行结果成功。所以在 cancel、 confirm 阶段需要做幂等处理。
- Author:newrain-zh
- URL:https://alex.sh.cn/article/tcc-example
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!