首页 > 分布式 > 分布式事物实现方式

分布式事物实现方式

作者:bin
  • 一、2PC两段提交方案

XA方式:

主要是基于数据库的事物来实现的,需要两阶段提交: prepare 和 commit. 

1.段为 准备(prepare)阶段。即所有的参与者准备执行事务并锁住需要的资源。参与者ready时,向transaction manager报告已准备就绪。
2.提交阶段(commit)。当transaction manager确认所有参与者都ready后,向所有参与者发送commit命令。

例如我们要同时对2个DB进行更新(或插入)操作,transaction manager就同时开启2个DB的transaction,然后2个事物都先后做commit,如果有一个失败,即2个都回滚。

这种同服务操作2个不同DB的情况比较少出现,一般不允许直接访问其他团队的DB,需要更新其他团队的数DB数据,都是通过接口形式去做

Seata方式实现:

Seata是阿里巴巴开源的一个分布式事物框架,他与XA最主要的区别是在ready阶段就将本地事物进行了提交同时写入undolog,然后通知其他事物参与者执行事物,如果有一个执行失败,那么已经提交的事物,就执行回滚操作

  • 二、TCC 方案

TCC 的全称是:Try、Confirm、Cancel,主要针对的是服务资源的占用

try : 事物协调器通知各个服务方,进行准备
Confirm : 事物协调器在各个服务方都准备好后,通知各个服务方执行commit
Cancel :如果有一个服务方执行Confirm失败,即通知事物协调器,事物协调器,通知其他都服务进行Cancel回滚

这个方案问题在于,Cancel需要写回滚都逻辑,回滚逻辑一般很复杂而且很难维护,这种一般是用在需要对数据要求很严格都地方,例如提现,转账,涉及到钱的地方

  • 三、MQ可靠消息最终一致性方案


1.生产者会先发一条prepare消息个MQ,表示我准备开始执行业务
2.MQ收到消息后将消息状态置为(不可见/待发送)做持久化,做完持久化之后通知生产者,可以开始事物
3|4|5|6.生产者收到确认消息后开始执行事物,如果执行失败,通知MQ删除消息,如果执行成功,通知MQ将消息置为(可见/可发送)
7|8.MQ将消息发送给消费者,消费者开始执行事物,在执行成功后,通知MQ,执行成功,MQ删除消息。
重试逻辑:MQ如果迟迟没有收到消费者执行成功的消息,会进行重试推送,直至成功,或者超过重试次数。

  • 四、最大努力通知

本地事物执行成功后,尽最大努力通知其他分支事物执行,保证最终一致性。

最大努力通知对一致性要求较低的地方可以使用,实现的方式是:
1、本地事物执行成功后,通知其他分支事物执行,如果通知失败,重试通知。

2、重试通知若干次后不再通知,提供一个查询结构,给其他事物来查询本地事物的执行结果,从而保证最终一致性。

您必须 [ 登录 ] 才能发表留言!