1.TCC协议
TCC协议通常由三个阶段组成:
1.1.Try 阶段
在这个阶段中,参与者会尝试执行事务,并将所有要修改的数据保存在一个本地事务中。如果所有的参与者都执行成功,那么它们就会向协调者报告这一事实。
提示:这个阶段,实际业务场景就是提前预留资源,例如,预扣库存,提前把库存扣了。
1.2.Confirm 阶段
如果所有的参与者都成功执行了 Try 阶段,那么协调者会向所有参与者发出确认提交的指令。在这个阶段中,参与者将提交事务,释放资源,并向协调者报告操作成功。
提示:这个阶段,相当于本地事务的Commit阶段,就是提交事务,例如:把try阶段的预扣库存,真扣了。
1.3.Cancel 阶段
如果在 Try 阶段中有任何参与者执行失败,那么协调者会向所有参与者发出取消事务的指令。在这个阶段中,参与者将回滚事务,释放资源,并向协调者报告操作失败。
通过这些步骤,TCC协议可以保证在分布式系统中的事务操作要么全部提交,要么全部回滚,从而确保了数据的一致性。
2.TCC示意图
下面是tcc协议流程图(UML时序图)
3.TCC缺点
3.1.实现复杂
相对于2PC协议而言,TCC协议的实现较为复杂。由于TCC协议涉及到 Try、Confirm、Cancel 等多个步骤,需要在应用程序中对这些步骤进行实现,而且对于不同的业务场景,TCC协议的实现方式也可能不同,因此实现难度较大。
3.2.资源占用
在TCC协议的 Try 阶段中,需要将所有要修改的数据保存在一个本地事务中,直到 Confirm 阶段才会将事务提交并释放资源。这样会占用一定的内存和其他资源,并且当参与者较多时,可能会造成资源的浪费。
提示:可以通过资源预扣的方式,避免通过本地事务锁定资源。
3.3.性能瓶颈
TCC协议需要多次网络通信,从 Try 阶段到 Confirm 或 Cancel 阶段,每个阶段都需要进行网络通信。当参与者数量较多时,这种多次通信会对系统性能产生影响。
提示:其实所有强一致性的分布式事务实现方案,都比较占资源,能不用就不用。
4.TCC协议与2PC协议的区别
4.1.实现层次不同
TCC是在应用层面实现的分布式事务协议,而2PC是在数据库层面实现的分布式事务协议。
4.2.算法不同
TCC是通过一系列的 Try-Confirm/Cancel 操作来实现事务的提交或回滚,而2PC是通过发送提交请求、投票和提交/回滚命令等步骤来实现事务的提交或回滚。
4.3.可扩展性不同
2PC在处理大规模分布式系统时存在可扩展性问题,因为在参与者数量较大时,协调者需要进行大量的网络通信和等待,从而导致性能下降。而TCC协议相对于2PC协议更加灵活和可扩展,可以根据需要增加或减少参与者,而不会影响整个分布式系统的性能。
4.4.容错性不同
2PC协议的缺点是单点故障,如果协调者发生故障,整个分布式事务就无法完成,而TCC协议在实现中可以采用分布式协调者来解决单点故障问题,从而提高了容错性。