分布式事务

目录

一、Mysql本地事务和事务隔离级别

1.数据库事务

2.Mysql事务操作

3.数据库并发访问冲突问题

二、分布式事务方案

1.什么是分布式事务

2.分布式事务方案

三、Seata介绍

四、Seata AT事务方案

1.介绍

2.业务场景-订单系统

3.Seata  AT基本原理

4.第一阶段:执行各分支事务

5.第二阶段:控制全局事务最终提交

6.第二阶段:全局事务最终回滚

五、Seata  AT具体工作机制

1.第一阶段:执行分支事务

 2.第二阶段:控制全局事务最终回滚

 3.第二阶段:控制全局事务最终提交


一、Mysql本地事务和事务隔离级别

1.数据库事务

数据库事务由一组sql语句组成,所有sql语句执行成功则事务整体成功;任一条sql语句失败则事务整体失败,数据恢复到事务之前的状态。

数据操作的最小单元是事务,而不是一条sql语句!

2.Mysql事务操作

  • 开始事务:start  transaction;  或  begin;                                                                                        (注:事务开始后,对数据的增删改操作不直接修改数据表,而是被记录在日志文件中)   
  • 提交事务: commit;                                                                                                                     (注:将日志中记录的操作,永久保存到数据表,并清空日志文件)
  • 回滚事务:rollback;                                                                                                                   (注:直接清空日志文件)

3.数据库并发访问冲突问题

   脏读: 读取到其他事务未提交的数据

   不可重复读:                                                                                                                    

  • 重复读取同一数据时,与之前读取的数据不一致
  • 一个事务提交的数据,可以被另一个事务立即读取      

   幻读:

  • 读取到已经被删除的数据
  • 读取不到新插入的数据 

二、分布式事务方案

1.什么是分布式事务

普通事务:

事务

分布式事务:

分布式事务

注:在微服务系统中,每个微服务应用都可能会有自己的数据库,它们首先需要控制自己的本地事务。一项业务操作可能会调用执行多个微服务。如何保证多个服务执行的多个数据库的操作整体成功或整体失败?这就是分布式事务要解决的问题。

2.分布式事务方案

  • XA
  • TCC
  • Seata框架AT事务
  • SAGA
  • 可靠消息最终一致性
  • 最大努力通知

dt

三、Seata介绍

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

四、Seata AT事务方案

1.介绍

Seata 的 AT 模式(Automatic Transaction)是一种无侵入的分布式事务解决方案。下面结合具体业务场景来分析其执行的原理。

2.业务场景-订单系统

业务

 当给用户下订单时,执行以下三步流程:

  1. 订单系统保存订单
  2. 订单系统调用库存服务,减少商品
  3. 订单系统调用账户服务,扣减用户金额

这三步要作为一个整体事务进行管理,要么整体成功,要么整体失败。

3.Seata  AT基本原理

Seata  AT事务分两个阶段来管理全局事务:

  • 第一阶段:执行各分支事务
  • 第二阶段:控制全局事务最终提交或回滚

4.第一阶段:执行各分支事务

微服务系统中,各服务之间无法相互感知事务是否执行成功,这时就需要一个专门的服务,来协调各个服务的运行状态。这个服务称为 TC(Transaction Coordinator),事务协调器。

tc

 订单系统开始执行保存订单之前,首先启动 TM(Transaction Manager,事务管理器),由 TM 向 TC 申请开启一个全局事务:

TM

这时TC会产生一个全局事务ID,称为 XID,并将 XID 传回 TM:

 xid

这样就开启了全局事务

全局事务开启后,开始执行创建订单的业务。首先执行保存订单,这时会先启动一个 RM(Resource Manager,资源管理器),并将 XID 传递给 RM。

rm

RM 负责对分支事务(即微服务的本地事务)进行管理,并与 TC 通信,上报分支事务的执行状态、接收全局事务的提交或回滚指令。

RM 首先会使用 XID 向 TC 注册分支事务,将分支事务纳入对应的全局事务管辖。

 rm

现在可以执行保存订单的分支事务了。一旦分支事务执行成功,RM 会上报事务状态:

 

TC 收到后,会将该状态信息传递到 TM:

 o

到此,保存订单过程结束。下面是调用库存服务,减少商品库存,与订单的执行过程相同。

首先调用库存服务,启动 RM,并传递 XID:

 s

库存服务的 RM 使用 XID 向 TC 进行注册,纳入全局事务管辖:

s

执行本地事务成功后上报状态,TC会将状态发送给TM:

 

相同的,完成账户分支事务:

 a

5.第二阶段:控制全局事务最终提交

现在,TM(全局事务管理器)收集齐了全部分支事务的成功状态,它会进行决策,确定全局事务成功,向 TC 发送全局事务的提交请求:

然后,TC 会向所有 RM 发送提交操作指令,RM 会完成最终提交操作:

 

 到此,全局事务全部提交完成!

6.第二阶段:全局事务最终回滚

上面是全局事务执行成功的情况,下面再来看看事务执行失败的情况。

假设订单业务执行过程中,扣减账户金额这一步分支事务执行失败,那么失败状态对TC上报,然后再发送给TM:

a 

 TM 会进行决策,确定全局事务失败,向 TC 发送全局事务的回滚请求:

 

 然后,TC 会向所有 RM 发送回滚操作指令,RM 会完成最终回滚操作:

 

五、Seata  AT具体工作机制

1.第一阶段:执行分支事务

以全面订单业务中的库存服务为例,库存表中存在一条商品的库存信息:

 

 现在要执行业务操作减少库存,从50件减少到40件:

 

执行修改库存业务操作前, 会先取出旧的库存信息:

 现在可以修改库存了:

 接着,取出更新后的新数据:

 接下来,会把旧数据和新数据合并起来,保存到一个事务回滚日志表:undo_log表:

 至此,第一阶段,分支事务完成,将状态上报给TC:

 2.第二阶段:控制全局事务最终回滚

假如全局事务失败,那么第一阶段已提交的分支事务要执行回滚操作。

首先会收到来自 TC 的全局事务回滚指令:

 

 接下来,根据事务回滚日志(undo_log)表的记录,将商品恢复成旧的库存数据:

 

 然后删除事务日志,最终完成第二阶段回滚操作:

 

 3.第二阶段:控制全局事务最终提交

上面是全局事务回滚操作。如果全局事务成功,要完成最终提交,AT模式最终提交操作非常简单,只需要删除日志数据即可。

首先接收到 TC 的全局事务提交指令:

 

 接着,直接删除事务日志,就完成了第二阶段提交操作:

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值