分布式事务-事务补偿(TCC)

460 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情

事务补偿(TCC)是什么

TCC事务补偿是基于2PC实现的事务控制方案,相当于是一个补足,TCC分别表示:Try、Confirm和Cancel。其含义为:

  1. Try:检查及预留数据库业务资源,完成提交事务前的检查,并预留好资源,不执行commit,失败则重试。
  2. Confirm:确定执行业务操作,对try阶段预留的资源正式执行commit,失败则重试。
  3. Cancel:取消执行业务操作 对try阶段预留的资源释放,相当于回滚,失败则重试。

事务补偿(TCC)说明

以一个下单减库存的业务为例说明:

Try阶段

一个下单操作,内部由订单服务和库存服务协同完成,订单服务生成订单信息,库存服务扣减库存数量。

在try阶段订单服务和库存服务会检查并预留资源。

订单服务检查当前是否满足提交订单的条件,例如当前用户的状态、是否有未完成的订单等信息,如果检查未通过,则不允许创建订单,之后的一系列操作也会终止于此。

而库存服务检查当前是否有充足的库存,并锁定库存资源,避免在此期间其他操作对库存有所变更。

Confirm阶段

订单服务和库存服务都成功完成Try阶段后,开始正式执行资源操作。 订单服务向订单写一条订单信息并执行commit操作。 库存服务执行库存减少操作并执行commit操作。

Cancel阶段

如果订单服务或者库存服务有一方出现失败的情况,则订单服务和库存服务都全部取消操作。 订单服务需要删除新增的订单信息。 库存服务将减去的库存还原。

总结

事务补偿(TCC)的优点:保了证数据的最终一致性,在业务层实现事务控制,灵活性好。 事务补偿(TCC)的缺点:开发成本高,每个需要实现分布式事务的地方都需要每个参与者实现try/confirm/cancel三个接口。

在try/confirm/cancel每个阶段如果发生了失败情况,则会不断重试,这也说明了为什么是保证了数据的最终一致性。

注意,在有重试机制存在的情况下,则需要try/confirm/cancel每个接口都实现幂等性,即操作多次的结果和操作一次的结果是一致的。