分布式事务指事务的操作位于不同的结点上,需要保证事务的AICD特性。
例如在下单场景下,库存和订单如果不在同一个结点上,就涉及到分布式事务了。
解决方案
通过引入协调者Coordinator来协调参与者的行为,并最终决定这些参与者是否要真正执行事务。
协调者询问参与者事务是否执行成功,参与者发送事务的执行结果给协调者。这个时候参与者执行了事务,但是还没有提交。
如果事务在每个参与者上都执行成功,协调者发送通知让参与者提交事务,如果失败,则发送通知回滚事务。
目前支付宝使用两阶段提交思想实现了分布式事务服务 (Distributed Transaction Service, DTS) ,它是一个分布式事务框架,用来保障在大规模分布式环境下事务的最终一致性。具体可看文档:
核心思想是:针对每个操作,都要注册一个与其对应的确认和补偿操作,它分为三个阶段:
优点:
缺点:在2,3步都有可能失败。TCC属于应用层的一种补偿方式,基于 TCC 实现分布式事务,会将原来只需要一个接口就可以实现的逻辑拆分为 Try、Confirm、Cancel 三个接口,所以代码实现复杂度相对较高,需要程序员在实现的时候自己写很多补偿的代码。
实现:需要事务接口提供 try, confirm, cancel 三个接口,提高了编程的复杂性。依赖于业务方来配合提供这样的接口,推行难度大,所以一般不推荐使用这种方式。
本地消息表与业务数据表处于同一个数据库中,这样就能利用本地事务来保证对这两个表的操作满足事务特性,并且使用了消息队列来保证最终一致性。
优点: 一种非常经典的实现,避免了分布式事务,实现了最终一致性。
缺点: 消息表会耦合到业务系统中,如果没有封装好的解决方案,会有很多杂活需要处理。
如果是用的RocketMQ的话,是支持事务消息的,他们的方式也是类似于采用的二阶段提交,但是市面上一些主流的MQ都是不支持事务消息的,比如 RabbitMQ 和 Kafka 都不支持。
参考文章:
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.lingxiaomz.top/articleContent/?id=105859838086153402
内容来源于网络,如有侵权,请联系作者删除!