TCC(Try-Confirm-Cancel)的概念,最早是由 Pat Helland 于 2007 年发表的一篇名为《Life beyond Distributed Transactions:an Apostate’s Opinion》的论文提出。
TCC 是应用端的二阶段编程模型,其 Try、Confirm、Cancel 3 个方法均由业务编码实现:
TCC 机制中的 Try 仅是一个初步操作,它和后续的确认一起才能真正构成一个完整的业务逻辑,这个阶段主要完成:
TCC 事务机制以初步操作(Try)为中心的,确认操作(Confirm)和取消操作(Cancel)都是围绕初步操作(Try)而展开。
因此,Try 阶段中的操作,其保障性是最好的,即使失败,仍然有取消操作(Cancel)可以将其执行结果撤销。
以电商为例
用户下单涉及到
1.生成订单 (订单服务)
2.扣减库存(库存系统)
3.扣除积分(积分系统)
4.生成出库单(配送系统)
情况一没有出现任何异常的情况
try阶段
1.开启事物
2.创建订单
2.根据业务单号冻结库存
3.根据业务单号冻结积分
4.生成出库单出库单号为待确认
根据try阶段的结果执行commit或者rollback
1.commit(没有任何异常)
1.根据业务单号实际扣除库存(可能出现timeout 或者socketException 则重试直到成功 需要做幂等)
2..根据业务单号实际扣除积分(可能出现timeout 或者socketException 则重试直到成功 需要做幂等)
3.将出库单改为已确认((可能出现timeout 或者socketException 则重试直到成功 需要做幂等)
4.提交事物
2.rollback(部分步骤失败 执行rollback)
比如冻结积分返回积分不足,则回滚事物,根据业务单号执行取消冻结(可能出现timeout 或者socketException 则重试直到成功 需要做幂等)