什么是TCC
TCC(Try-Confirm-Cancel)的概念,最早是由 Pat Helland 于 2007 年发表的一篇名为《Life beyond Distributed Transactions:an Apostate’s Opinion》的论文提出。
TCC 是应用端的二阶段编程模型,其 Try、Confirm、Cancel 3 个方法均由业务编码实现:
- Try 操作作为一阶段,负责资源的检查和预留。
- Confirm 操作作为二阶段提交操作,执行真正的业务。
- Cancel 是预留资源的取消。
TCC处理流程
Try阶段
TCC 机制中的 Try 仅是一个初步操作,它和后续的确认一起才能真正构成一个完整的业务逻辑,这个阶段主要完成:
- 完成所有业务检查( 一致性 ) 。
- 预留必须业务资源( 准隔离性 ) 。
- Try 尝试执行业务。
TCC 事务机制以初步操作(Try)为中心的,确认操作(Confirm)和取消操作(Cancel)都是围绕初步操作(Try)而展开。
因此,Try 阶段中的操作,其保障性是最好的,即使失败,仍然有取消操作(Cancel)可以将其执行结果撤销。
以电商为例
用户下单涉及到
1.生成订单 (订单服务)
2.扣减库存(库存系统)
3.扣除积分(积分系统)
4.生成出库单(配送系统)
情况一没有出现任何异常的情况
try阶段
1.开启事物
2.创建订单
2.根据业务单号冻结库存
3.根据业务单号冻结积分
4.生成出库单出库单号为待确认
Confirm阶段
根据try阶段的结果执行commit或者rollback
1.commit(没有任何异常)
1.根据业务单号实际扣除库存(可能出现timeout 或者socketException 则重试直到成功 需要做幂等)
2..根据业务单号实际扣除积分(可能出现timeout 或者socketException 则重试直到成功 需要做幂等)
3.将出库单改为已确认((可能出现timeout 或者socketException 则重试直到成功 需要做幂等)
4.提交事物
2.rollback(部分步骤失败 执行rollback)
比如冻结积分返回积分不足,则回滚事物,根据业务单号执行取消冻结(可能出现timeout 或者socketException 则重试直到成功 需要做幂等)
针对重试 如果下游服务器挂了 可能一直重试不成功,可以增加一些活动日志 后台定时补偿 保证最终一致性
tcc开源框架
ByteTCC,TCC-transaction,Himly。
缺点
TCC 的 Try、Confirm 和 Cancel 操作功能要按具体业务来实现,业务耦合度较高,提高了开发成本。