分布式事务 -三种方案

分布式事务

前言

随着互联网的发展,分布式微服务越来越流行,使用分布式微服务,首要面临的问题就是:多服务对应多数据源。以往使用同一个数据源来管理存储数据,本地事务就可以很好地解决数据一致性的问题,但是使用分布式事务的话,就是两个系统,两个不同的数据源,无法用现有的Spring事务框架去控制不同系统的事务整体成功或整体失败。

RocketMQ

RocketMQ事务中存在两个概念,一个是半消息(Half Message),一个是MQ 会查。
Half Message :向MQ发送一个半消息,该消息只被MQ存储,不能被Consumer消费;
MQ会查:在MQ发送方向MQ Server发送了事务Prepared 半消息之后,一直未给MQ Server发送确认消息,则MQ Server会会查MQ发送方事务状态;

RocketMQ分布式事务原理,官方给出的架构图:
在这里插入图片描述
过程描述:
1、本地事务执行之前,会通过MQ生产者发送一个Half Message(transaction prepared该消息可被查询)给MQ 服务器;
2、MQ Server收到Half Message返回MQ生产者 CommitLog Offset的一个这样发送成功的标识;
3、开始执行本地事务;
4、本地事务执行完成之后,通过MQ生产者发送处理结果Commit/Rollback,CommitLog offset的消息给MQ Server;
5、如果MQ Server在一定时间内未收到处理结果信息,则会进行事务状态回查;
6、检查本地事务的状态;
7、再通过MQ生产者发送消息给MQ Server;
8、如果是commit状态,则会根据Offset从CommitLog中拿起Prepared消息,然后clone该消息生成新的消息,消息Body(内容)和Prepared的一致,会生成PostitionInfo和IndexInfo,该消息可以被消费,也可以被查询,如果是Rollback,会clone消息,不会生成PostitionInfo和IndexInfo,不能消费,也不能被查询

两阶段提交(2PC)

准备阶段:各微服务向事务管理器提交事务执行结果;
提交阶段:如果各微服务提交上来的结果都是成功,则事务管理器则通知各微服务提交事务,否则回滚;
在这里插入图片描述
实现步骤:
1、在微服务中产生/创建y一个本地事务,生成一个ID或索引可以关联到该事务的一个key;
2、保持该事务,将该事务的ID上传至事务管理中心,让事务管理中心管理每个事务当前状态;
3、当事务管理中心得到了该批次所有的事务状态成功,则通知各微服务本地提交事务,当事务管理中心得到的是该批次中某一个事务失败,则通知各微服务本地事务全部回滚。

TCC(Try、Confirm、Cancel)

TCC实现分布式事务,分三个阶段:Try、Confirm、Cancel

Try 阶段

在更改现有数据的时候记录原先的值,更改后的值,如果是计算过程,则记录计算过程的每个步骤的中间量值,预留资源
1、更改状态数据,假如原始存储值为1(未完成付款状态),更改为2(完成付款状态) 则预留资源就是记录两者值
2、更改数值数据,假如原始存储值为100,中间过程-20,记录中间值,预留资源就是20,方便反向计算

Confirm 阶段

分布式事务都是成功状态,则执行每个事务的Confirm阶段,只要Try成功,Confirm默认一定成功;

Cancel 阶段

在业务执行失败/错误的情况下,回滚所有的执行的业务,取消Try过程,释放预留资源;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值