首页 > 其他分享 >Seata分布式事务框架-AT模式与TCC模式介绍

Seata分布式事务框架-AT模式与TCC模式介绍

时间:2023-11-07 22:22:58浏览次数:28  
标签:事务 Seata 回滚 模式 TCC 订单 RM 全局 TC

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

业务场景
订单系统

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

订单系统保存订单 订单系统调用库存服务,
减少商品库存 订单系统调用账户服务,
扣减用户金额
这三步要作为一个整体事务进行管理,要么整体成功,要么整体失败。

Seata AT基本原理
Seata AT 事务分两个阶段来管理全局事务:
第一阶段: 执行各分支事务
第二阶段: 控制全局事务最终提交或回滚

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

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

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

这样就开启了全局事务!

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

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

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

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

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

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

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

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

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

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


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


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

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

第二阶段:控制全局事务最终回滚
上面是全局事务执行成功的情况,下面再来看看事务执行失败的情况。

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

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

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


TCC 基本原理
TCC 与 Seata AT 事务一样都是两阶段事务,它与 AT 事务的主要区别为:

TCC 对业务代码侵入严重
每个阶段的数据操作都要自己进行编码来实现,事务框架无法自动处理。

TCC 效率更高
不必对数据加全局锁,允许多个事务同时操作数据。


第一阶段 Try
以账户服务为例,当下订单时要扣减用户账户金额:

假如用户购买 100 元商品,要扣减 100 元。

TCC 事务首先对这100元的扣减金额进行预留,或者说是先冻结这100元:


第二阶段 Confirm
如果第一阶段能够顺利完成,那么说明“扣减金额”业务(分支事务)最终肯定是可以成功的。当全局事务提交时, TC会控制当前分支事务进行提交,如果提交失败,TC 会反复尝试,直到提交成功为止。

当全局事务提交时,就可以使用冻结的金额来最终实现业务数据操作:


第二阶段 Cancel
如果全局事务回滚,就把冻结的金额进行解冻,恢复到以前的状态,TC 会控制当前分支事务回滚,如果回滚失败,TC 会反复尝试,直到回滚完成为止。


多个事务并发的情况
多个TCC全局事务允许并发,它们执行扣减金额时,只需要冻结各自的金额即可:

————————————————
版权声明:本文为CSDN博主「闪耀太阳a」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Gufang617/article/details/129111735

标签:事务,Seata,回滚,模式,TCC,订单,RM,全局,TC
From: https://www.cnblogs.com/gaoyanbing/p/17816186.html

相关文章

  • 软件设计实验8:适配器模式
    实验8:适配器模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解适配器模式的动机,掌握该模式的结构;2、能够利用适配器模式解决实际问题。 [实验任务一]:双向适配器实现一个双向适配器,使得猫可以学狗叫,狗可以学猫抓老鼠。实验要求:1. 画出对应的类图; 2.......
  • 软件设计实验9:桥接模式
    实验9:桥接模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解桥接模式的动机,掌握该模式的结构;2、能够利用桥接模式解决实际问题。 [实验任务一]:两个维度的桥接模式用桥接模式实现在路上开车这个问题,其中,车可以是car或bus,路可以是水泥路或沥青路。实验要求......
  • 前端常用设计模式
    什么是设计模式?​设计模式(Designpattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,设计模式并不是一种固定的公式,而是一种思想,是一种解决问题的思路;使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码可维护性。设计模式不区分编......
  • 每日随笔——简单工厂模式
    [实验任务一]:女娲造人使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,如果传入参数R,则返回一个Robot对象。请用程序设计实现上述场景。实验要求:1.画出对应的类图;2.提交源代码;3.注意编程规范。类图: 源代码:......
  • 设计模式-工厂模式
    工厂模式是用来封装对象的创建。工厂模式有三种,它们分别是简单工厂模式,工厂方法模式以及抽象工厂模式,通常我们所说的工厂模式指的是工厂方法模式。下面分别介绍下这三种工厂模式。简单工厂模式简单工厂模式的定义:定义一个工厂类,根据传入的参数不同返回不同的实例,被创建的实例具有共......
  • 跟安卓官网开始学习新的架构模式(MVI)
    #首先:大家可以看下官网的简介:应用架构指南 | Android开发者 | AndroidDevelopers(google.cn)###再说下其他架构模式:一.mvcMVC的目的就是为了M和V代码分离,降低耦合性。Model:数据来源,网络请求数据和数据库数据。View:对应xml布局文件和动态的布局部分。Controller:逻辑控制部......
  • 设计模式(十一)享元
    一、定义运用共享技术有效地支持大量细粒度对象的复用,享元模式是一种结构型模式。二、描述享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式。享元模式的结构较为复杂,一般结合工厂模式一起使用,在其结构图中包含了一个享元工厂类,包含以下四个角色:1、Flyweigh......
  • 设计模式---策略模式+工厂
    关键词:设计模式,策略模式,工厂模式概要现在我需要实现一个功能,是添加一路SDI输出,但是输出的协议有不同,有udp、srt等,针对不同的协议我要做不同的操作,后面还有可能添加其他的协议,因此这里面用策略模式不错。由于单纯的策略模式并不能完全消除if...else...,这里我们用了工厂模式再进......
  • Redis集群之主从模式
    搭建主从架构单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。假设有A、B两个Redis实例,如何让B作为A的slave节点?●在B节点执行命令:slaveofA的IPA的port主从数据同步原理全量同步主从第一次同步是全量同步:master如何判断slave是......
  • 适配器模式和桥接模式代码
    适配器模式和桥接模式代码适配器模式[实验任务一]:双向适配器实现一个双向适配器,使得猫可以学狗叫,狗可以学猫抓老鼠。packagetest8;interfaceCat{voidcatchMouse();}packagetest8;interfaceDog{voidbark();}packagetest8;//具体的猫类class......