2023-03-20 12:27:39
分布式事务解析:深入剖析TCC实现原理
TCC(Try-Confirm-Cancel)是一种补偿型事务模式,旨在解决分布式环境中事务的一致性问题。通过将每个事务操作分为尝试(Try)、确认(Confirm)和取消(Cancel)三个阶段,TCC不仅优化了事务的执行流程,还提高了系统的整体效率和弹性。
一、TCC概念
TCC的核心思想在于将事务的每个操作拆分为三个明确的阶段:
二、TCC流程
以电商场景为例,用户购买商品并点击支付后,交易系统需要执行以下操作:更新订单状态为“已支付”、扣减库存、增加用户积分。在微服务架构下,这三个操作分别需要调用三个服务完成。如果这三个操作在一个服务中,就可以使用本地事务保证数据的一致性,但现在需要调用三个服务,就需要引入分布式事务。
引入TCC事务后,流程如下:
订单服务:更新订单状态为“支付中”。
库存服务:冻结库存(在库存表中新增一个冻结库存的字段)。
积分服务:预增加用户积分(在积分表中新增一个预增加积分的字段)。
此阶段负责资源的预检查和预留,确保后续的Confirm阶段可以无障碍地执行。
当Try阶段都执行成功时,进入Confirm阶段。
订单服务:更新订单状态为“已支付”。
库存服务:把冻结库存扣减到剩余库存上(更新剩余库存=剩余库存-冻结库存,冻结库存=0)。
积分服务:把预增加积分加到总积分上(更新总积分=总积分+预增加积分,预增加积分=0)。
此阶段负责确认资源,确保事务的最终一致性。
当Try阶段任何一个操作失败时,进入Cancel阶段。
订单服务:更新订单状态为“已取消”。
库存服务:释放冻结的库存。
积分服务:释放预增加积分。
此阶段负责回滚资源,撤销在Try阶段所做的准备工作。
三、TCC在电商场景的落地
在电商系统中,TCC事务的落地需要确保在Try阶段预留资源,在Confirm阶段确认资源,在Cancel阶段回滚资源。同时,还需要解决以下三大问题:
Confirm/Cancel操作失败问题:
解决方案:采用不断重试的方法,要求Confirm和Cancel接口支持幂等。
空回滚问题:
空回滚问题是指Try阶段某个服务的Try操作没有执行成功或者没有执行,就进入Cancel阶段执行Cancel操作回滚资源,导致数据错乱。
解决方案:在Cancel操作前增加事务状态检查。在Try操作开始时设置事务状态为TRYING,如果Try操作成功则更新状态为TRIED。在Cancel操作执行前检查状态,如果状态不是TRIED则不执行Cancel操作。
悬挂问题:
悬挂问题是指Cancel操作比Try操作先完成。通常出现的原因是由于网络延迟导致Try操作调用失败,就进入Cancel阶段执行Cancel操作,而此时Try操作还在执行。
解决方案:
与空回滚解决方案类似,Cancel操作前增加事务状态检查。
Try操作引入重试机制,如果调用Try操作超时可以进行有限次重试。
增加同步机制,使用分布式锁来控制Try和Cancel操作的执行顺序。
四、TCC的优势与局限
TCC模型的优势在于将事务处理分为三个阶段,使得事务处理更加灵活和可控,保证了数据的一致性,并减少了2PC资源锁定时间过长的问题。然而,TCC也存在一些局限:
综上所述,TCC是一种有效的分布式事务解决方案,但需要在设计和实现过程中充分考虑其局限性和可能遇到的问题。