什么是分布式事务,分布式事务有哪些方案(消息最终一致性、Seata)

分布式事务

在分布式微服务的环境下,单体架构的服务进行了拆分,分别部署到了不同的服务器中,当某一个业务,比如下单购买商品场景,下单时需要与订单系统、物流系统、商品&库存系统、支付系统做交互,首先生成订单并且对商品进行库存减1,这时库存不够导致减库存失败,但由于服务部署在不同的系统中,不是同一个数据库连接导致无法对订单系统的回滚,导致整个操作不具备原子性,简而言之分布式事务是确保在两个不同的数据库连接的操作要么一起成功要么一起失败且满足原本两个数据库连接的事务特性。

消息最终一致性

RoketMQ事务消息,生产者首先会向MQ发送half消息,这个消息发送给MQ后MQ会定时去访问生产者,生产者完成本地事务操作后就会通知告诉MQ,若生产者本地事务为Commit则会将half消息对下游的消费者可见,若Rollback MQ将不会把half消息投递给消费者。具体流程如下:

1、生产者发送half消息给MQ。

2、half消息在MQ中持久化成功,发送ACK给生产者。

3、生产者执行本地事务。

4、生产者本地事务提交或回滚通知MQ,若提交则会将half消息更改为对下游消费者可见,若回滚则MQ事务回滚不会投递给消费者。

5、若生产者长时间没有提交或回滚,MQ会去检查生产者的事务状态。

6、生产者接收检查本地事务的状态,本地事务状态有三种1、Commit 2、Rollback 3、Unknown未知状态。

7、生产者返回状态,MQ发现若为Commit则会将half消息更改为对下游可见,若回滚MQ事务回滚,不会将消息投递给消费者,若消息的状态还是未知,则继续定时去检查生产者的事务状态。
在这里插入图片描述

Seata

在分布式事务DTP模型中有三个部分,TM、TC、RM,TM为事务管理器、TC为事务协调器、RM为资源管理器。

AT模式:

在这里插入图片描述

两段式提交,在seata的分布式事务模型中有三个部分具体流程如下:

一阶段:

1、先解析SQL,以Update为例,通过update的where条件,生成select语句查询出数据,这个数据为前置镜像。

2、执行update语句,并将执行后的结构作为后置镜像。

3、将前置镜像与后置镜像一同写入undolog表中。

4、准备提交本地事务,提交本地事务前,需要向事务协调器申请全局锁,获取到全局锁后进行本地事务提交并提交undolog数据。

5、告知事务协调者,本地事务已完成一阶段提交。

二阶段:

提交:

一阶段中所有RM告知事务协调者一阶段事务提交,然后事务协调者就会将这个全局事务所关联的undolog表中的数据删除。

回滚:

若RM告知事务协调者是回滚操作,则会通过全局事务id和分支事务id查询这个事务所关联的undolog日志,并将undolog日志中的后置镜像与数据库中实际的数据进行比对,因为一阶段本地事务已经提交了,这个阶段可能存在有其他事务修改了这条数据,这块需要配置策略进行处理,若undolog日志中的后置镜像与数据库中实际的数据一致,则进行回滚。

注意: AT模式的核心就是undolog表的前置与后置镜像,但是者存在并发场景下的aba问题,用户金额为100,这时扣除了50还剩50,一阶段提交,然后其他账号给该用户转账三十,然后又被扣除三十,这样的话二阶段回滚确实是一致的,回滚确实是能回滚到100,但是问题来了,在某种情况下用户的账户应当有130。

XA模式

遵循DTP模型,XA模式主要是针对于事务管理器与多个资源管理器的交互,具体流程如下:

1、事务管理器开启全局事务,向全局事务协调器去申请全局事务ID。

2、事务管理器获取到全局事务ID后,RM在执行完SQL后会去注册这个分支事务,注册完毕后,进行prepare一阶段预提交。

3、其他的RM也是如此,但是其他RM出现异常情况,事务管理器会通知事务协调者去进行全局回滚。

注意:XA模式中若A事务没有二阶段的提交或回滚的话,那么A事务所关联的资源管理器的数据库连接是不会释放。
在这里插入图片描述

  • 22
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一码归一码@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值