TCC分布式事务,分为三个阶段,Try(尝试)-Confirm(确认)-Cancel(取消),他的本质就是预留资源,比如对状态的变更,对金额的冻结,下面通过一个出库的例子来说明。
仓库人员清单完货品,确认出库,此时系统需要两个操作,一个是库存订单状态从未出库更改为已出库,另外一个是库存的扣减。
try
try的时候就是对资源的预留,比如订单,就要把状态从未出库改为待出库,库存比如是100,此时要加一个冻结库存字段,冻结值为此次的出库数量,假设10,实际库存变成了100-10=90。
try的时候直接在数据库做变更,当然我们并不是直接的变更值,而是先做判断。
比如状态是待出库或者已出库,则此时就不能更改。
比如库存此时不足10,扣减失败。
Confirm
如果符合出库和库存扣减条件,则确认业务,把待出库的状态改已出库,把库存改为90,冻结为0。
Cancel
如果某个条件不满足或者都不满足,则取消业务,把待出库的状态改为未出库,把库存改为100,冻结为0。也就是说把资源恢复到之前的状态。
和2PC区别
- TCC对业务的侵入性很大,每个子业务都要写Try-Confirm-Cancel,。2PC是在数据库层面上控制的,对开发者是无感知的。
- 2PC是强一致性事务,TCC是最终一致性事务(当然有可能订单服务是try执行成功,库存服务的try执行失败,这个时候要保证多个系统的可用性)。
- TCC每个阶段都是本地提交事务,而2PC会一直锁住资源直至整个过程结束,所以TCC的性能更高,有更高的吞吐量。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。