Seata 的4种事务模式(XA、AT、TCC、SAGA)

news2024/11/26 15:49:00

目录

前言

Seata架构

事务模式

XA

AT

TCC

区别


前言

在分布式系统中,实现一个功能可能需要由几个不同的服务来共同实现。这就会带来一个问题,不同的服务之间无法做到使用同一个事务,这就无法保证数据的一致性了。在一些对数据一致性要求不要的业务场景中,可以基于本地消息表来实现分布式事务,只需要保证最终一致性就行了。

基于本地消息表实现分布式事务(最终一致性)_本地消息表处理分布式事务-CSDN博客文章浏览阅读1k次,点赞33次,收藏11次。传统单体架构下,所有的功能模块都在一个应用下,所有的代码和业务逻辑都在同一个应用下实现,所以保证数据的一致性就很简单,保证相关操作都在同一个本地事务下就可以了。但是在微服务架构下,将一个应用拆分成了多个独立的服务,每个服务都能有自己的数据库,服务间通信都是通过远程调用实现,实现一个功能可能需要由几个不同的服务来共同实现。这就会带来一个问题,不同的服务之间无法做到使用同一个事务,这就无法保证数据的一致性了。_本地消息表处理分布式事务https://blog.csdn.net/typeracer/article/details/140998899但是也存在一些需要强一致性的业务场景,实际工作中开发过一个事件设计器,设计器中支持各种业务节点,对节点进行编排从而来自定义业务逻辑。不同的节点的实现需要调用不同的服务来实现,故存在分布式事务的问题。对各个节点的服务调用,需要保证所有事务的原子性,要么一起提交,要么一起回滚,所以最后通过引入Seata来解决

在学习 Seata 时,对各种事务模式都做了了解,对比后才能为系统选择最合适的事务模式。在事件设计器中,由于业务对实时性要求不高,所以直接使用XA模式,集成最简单,没有代码侵入。

Seata架构

  • TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚。
  • TM (Transaction Manager) - 事务管理器:定义全局事务的范围、开始全局事务、提交或回滚全局事务。
  • RM (Resource Manager) - 资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

分布式事务基本流程

事务模式

  1. XA模式:强一致性分阶段事务模式,牺牲了一定的可用性,无业务侵入
  2. AT模式:最终一致的分阶段事务模式,无业务侵入,也是Seata的默认模式
  3. TCC模式:最终一致的分阶段事务模式,有业务侵入
  4. SAGA模式:长事务模式,有业务侵入

XA

plantuml

@startuml
'https://plantuml.com/sequence-diagram

autonumber 1.1

participant TM
participant RM
participant TC

TM -> TC: 开启全局事务
TM <-- TC: XID
TM -> RM: 远程调用 XID
RM -> TC: 注册分支事务
RM -> RM: 执行业务sql
RM -> TC: 报告分支事务状态

autonumber inc A

TM -> TC: 提交/回滚全局事务
TC -> TC: 检查分支事务状态
RM <- TC: 提交/回滚

@enduml

优点

  • 事务的强一致性,满足ACID原则。
  • 常用数据库都支持,实现简单,并且没有代码侵入

缺点

  • 因为一阶段需要锁定数据库资源,等待二阶段结束才释放,性能较差
  • 依赖关系型数据库实现事务

AT

AT模式是Seata的默认事务模式

在使用前,需要在对应的业务库中创建一张 undo_log 表,用来保存快照

建表语句(MySQL)

CREATE TABLE `undo_log` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(100) NOT NULL,
  `context` varchar(128) NOT NULL,
  `rollback_info` longblob NOT NULL,
  `log_status` int(11) NOT NULL,
  `log_created` datetime NOT NULL,
  `log_modified` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

流程图

plantuml

@startuml
'https://plantuml.com/sequence-diagram

autonumber 1.1

database undo_log
participant TM
participant RM
participant TC

TM -> TC: 开启全局事务
TM <-- TC: XID
TM -> RM: 远程调用 XID
RM -> TC: 注册分支事务
RM -> RM: 执行业务sql并提交
undo_log <- RM: 记录更新前后快照
RM -> TC: 报告分支事务状态

autonumber inc A

TM -> TC: 提交/回滚全局事务
TC -> TC: 检查分支事务状态
RM <- TC: 提交/回滚
undo_log <- RM: 删除log/回复log数据

@enduml

优点

  • 一阶段完成直接提交事务,释放数据库资源,性能比较好
  • 没有代码侵入,框架自动完成回滚和提交

缺点

  • 软状态,事务是最终一致
  • 框架的快照功能会影响性能,但比XA模式要好很多

TCC

 TCC模式将事务拆成了三个接口实现(try,commit,cancel),同时也带来了以下三个问题

  1. 幂等:在 commit/cancel 阶段,因为 TC 没有收到分支事务的响应,需要进行重试,这就要分支事务支持幂等
  2. 空回滚:在 try 阶段发生了故障,try 阶段在不考虑重试的情况下,全局事务必须要走向结束状态,这样就需要执行一次 cancel 操作
  3. 悬挂:因为网络问题,RM 开始没有收到 try 指令,但是执行了 cancel 后 RM 又收到了 try 指令并且预留资源成功,这时全局事务已经结束,最终导致预留的资源不能释放

在1.5.1以前,这些问题需要自己在代码中解决,而1.5.1版本以后(包含1.5.1),Seata就自己解决这些问题了

需要在对应的业务库中创建一张 tcc_fence_log 表

建表语句(MySQL)

CREATE TABLE IF NOT EXISTS `tcc_fence_log`
(
    `xid`           VARCHAR(128)  NOT NULL COMMENT 'global id',
    `branch_id`     BIGINT        NOT NULL COMMENT 'branch id',
    `action_name`   VARCHAR(64)   NOT NULL COMMENT 'action name',
    `status`        TINYINT       NOT NULL COMMENT 'status(tried:1;committed:2;rollbacked:3;suspended:4)',
    `gmt_create`    DATETIME(3)   NOT NULL COMMENT 'create time',
    `gmt_modified`  DATETIME(3)   NOT NULL COMMENT 'update time',
    PRIMARY KEY (`xid`, `branch_id`),
    KEY `idx_gmt_modified` (`gmt_modified`),
    KEY `idx_status` (`status`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;

流程图

plantuml

@startuml
'https://plantuml.com/sequence-diagram

autonumber 1.1

database tcc_fence_log
participant TM
participant RM
participant TC

TM -> TC: 开启全局事务
TM <-- TC: XID
TM -> RM: 远程调用 XID
RM -> TC: 注册分支事务
RM -> RM: 锁定资源(try)
tcc_fence_log <- RM: 插入防空回滚记录
note left
    插入一条记录
    status值为STATUS_TRIED
    在 Rollback 阶段判断记录是否存在
    如果不存在,则不执行回滚操作
end note
RM -> TC: 报告分支事务状态

autonumber inc A

TM -> TC: 提交/回滚全局事务
TC -> TC: 检查分支事务状态
RM <- TC: 提交/回滚

tcc_fence_log <- RM: 幂等判断
note left
    判断 tcc_fence_log 表中是否已经有记录
    如果有记录,则判断事务执行状态是否为 STATUS_COMMITTED
    是的话就不会再次提交,保证了幂等
    如果 tcc_fence_log 表中没有记录
    则插入一条记录,供后面重试时判断。
end note

tcc_fence_log <- RM: 插入防悬挂记录
note left
    执行 cancel 方法时
    判断 tcc_fence_log 是否存在当前 xid 的记录
    如果没有则向 tcc_fence_log 表插入一条记录
    状态是 STATUS_SUSPENDED,并且不再执行回滚操作
    后面执行 try 阶段方法时首先会向 tcc_fence_log 表插入一条当前 xid 的记
    这样就造成了主键冲突
end note

RM <- RM: 提交(commit)/回滚(cancel)

@enduml

优点

  • 一阶段完成直接提交事务,释放数据库资源,性能好
  • 相比AT模型,无需生成快照,无需使用全局锁,性能最强
  • 不依赖数据库事务,而是依赖补偿操作,可以用于非事务型数据库

缺点

  • 有代码侵入,需要人为编写try、Confirm和Cancel接口
  • 软状态,事务是最终一致

区别

XAATTCCSAGA
一致性
强一致
弱一致
弱一致
最终一致
隔离性
完全隔离
基于全局锁隔离
基于资源预留隔离
无隔离
代码侵入
有,要编写三个接口
有,要编写状态机和补偿业务 
性能
非常好
非常好
场景
对一致性、隔离性有高要求的业务
基于关系型数据库的大多数分布式事务场景
对性能要求较高的事务
有非关系型数据库要参与的事务
业务流程长、业务流程多 
参与者包含其它公司或遗留系统服务,无法提供 TCC 模式要求的三个接口

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2100403.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SSM的“基于决策树算法的大学生就业预测系统”的设计与实现(源码+数据库+文档)

基于SSM的“基于决策树算法的大学生就业预测系统”的设计与实现&#xff08;源码数据库文档) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统用户用例图 学校基础信息管理 毕业生基…

Java设计模式之装饰器模式详细讲解和案例示范

1. 引言 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许向现有对象添加新的功能&#xff0c;而无需修改其结构。这种模式通过使用组合而非继承来扩展对象的行为&#xff0c;在许多实际应用中极为常见。本文将详细介绍装饰器模式…

世界复合医学杂志社世界复合医学编辑部2024年第4期目录

论著 苏子降气汤联合三子养亲汤治疗痰浊壅肺型慢性阻塞性肺疾病急性加重期的临床疗效 周芹;周磊; 1-437 天麻钩藤汤加减联合依那普利叶酸片对原发性高血压患者血压水平与中医证候积分的影响 邹文博;王世雄; 5-8 伏诺拉生联合康复新液治疗反流性食管炎的临床研究 孙…

山体滑坡监测预警系统—百科分享

GNSS山体滑坡监测预警系统是一种利用全球导航卫星系统(GNSS)技术&#xff0c;对易发生山体滑坡的地段进行24小时不间断监测的先进系统。该系统能够实时记录易滑坡地段山体的各种变化情况&#xff0c;为灾害预警和防治提供科学依据。 GNSS山体滑坡监测预警系统通过在地表关键位置…

05-最新PyCharm安装详细教程及pycharm配置

一、PyCharm简介及其下载网站 PyCharm是由JetBrains打造的一款Python IDE&#xff08;Integrated Development Environment&#xff0c;集成开发环境&#xff09;&#xff0c;带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。PyCharm提供了代码编辑、调试、语…

700道学生百科知识题库ACCESS\EXCEL数据库

今天这个题库虽然记录数不多&#xff0c;但是题目很经典、精彩、精华&#xff0c;分7个难度级别&#xff0c;每个级别100题&#xff1b;分类也很多&#xff0c;包含&#xff1a;百科、常识、地理、动画、国学、化学、历史、旅游、美食、诗词、数学、体育、天文、文学、物理、星…

如何选择合适的同轴连接器?关键性能指标全解析

同轴连接器是用于连接同轴电缆或同轴传输线与其他电子设备或另一段同轴电缆的一种装置。它们在射频&#xff08;RF&#xff09;和微波通信系统中非常常见&#xff0c;因为它们能有效减少信号损耗并提供良好的屏蔽&#xff0c;以防止电磁干扰&#xff08;EMI&#xff09;。 基本…

执行标准应该公开吗?

在当今社会&#xff0c;标准的重要性日益凸显。执行标准&#xff0c;如同商业世界和公共生活中的指南针&#xff0c;为产品质量、服务水平以及各类活动划定了清晰的界限。那么&#xff0c;执行标准应该公开吗&#xff1f;这是一个值得我们深入探讨的关键问题。 一、对于国家标…

如何在VSCode中同时打开多个页面?

问题描述&#xff1a; 使用VSCode的时候&#xff0c;为什么打开一个文件之后就会把另一个文件顶替&#xff0c;始终保持打开一个文件的状态呢&#xff1f;如果我想同时打开两个文件页面怎么办&#xff1f; 解决办法&#xff1a; 在 Visual Studio Code (VSCode) 中&#xff…

手机播放DVD:VLC播放器(直接下载apk)

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

飞睿智能酒店人体存在感应雷达模块24G传感器,智能空调、LED照明开关节能新风尚

在科技日新月异的今天&#xff0c;智能酒店已经不再是遥不可及的梦想&#xff0c;而是逐渐走进了我们的日常生活。从智能门锁到自动调节的室内环境&#xff0c;再到贴心的语音助手服务&#xff0c;智能酒店为我们带来了未有的便捷与舒适。然而&#xff0c;在这些令人惊叹的智能…

Sankey流图在老年癌症患者症状分析中的应用|科研绘图·24-09-03

小罗碎碎念 本期推文主题&#xff5c;桑基图 桑基图我们很多人都不陌生&#xff0c;但是大部分应该都是仅限于在文献中读到过&#xff0c;动手去实践的较少&#xff0c;在文献中的具体作用&#xff0c;可能也不太清楚&#xff0c;所以我这一期推文就来盘一盘桑基图。 本期推文…

机器学习算法五之 目标检测评价指标 IOU 准确率 召回率等

机器学习算法五之 目标检测评价指标 IOU 准确率 召回率等 在目标检测算法中&#xff0c;训练出一个模型&#xff0c;想要知道这个模型的效果怎么样&#xff0c;主要是从模型的指标得出的&#xff0c;指标不仅在论文还是在自己学习的过程中&#xff0c;都是十分重要的&#xff…

第十五届蓝桥杯青少组省赛成绩查询及国赛考试安排

刚刚&#xff0c;蓝桥杯青少组官网发布了“关于第十五届蓝桥杯大赛青少组省赛成绩查询及全国总决赛参赛证下载的通知”&#xff0c;第十五届蓝桥杯大赛青少组将开通省赛成绩查询通道&#xff0c;获得省赛一等奖的选手晋级全国总决赛&#xff0c;全国总决赛比赛时间为9月7日。 关…

全球大脑外滩“论剑”:2024年科技人文十大热点问题揭晓

当越来越多工作岗位可能被AI替代&#xff0c;如何实现人的劳动诉求和人生价值&#xff1f;当AI开始弥补甚至取代情感陪伴这一曾经独属于人类的体验&#xff0c;将带来哪些新可能和新问题&#xff1f; 9 月 3 日&#xff0c;外滩大会官微发布2024 Inclusion外滩大会科技人文十大…

高端控制台使用过程中如何保证用电安全

在数字化时代&#xff0c;高端控制台作为数据中心、监控室及正规工作站的核心设备&#xff0c;其稳定运行对于保障业务连续性至关重要。而用电安全&#xff0c;则是这一稳定运行不可或缺的前提。高端控制台集成了大量精密电子设备&#xff0c;对电力供应的质量与稳定性有着极高…

Spring Boot源码阅读——spring.factories的加载机制

Spring Boot源码阅读——spring.factories的加载 提到 SpringBoot 的自动装配&#xff0c;不管是文章还是视频&#xff0c;都会提到 spring.factories 这个文件&#xff0c;这篇文章就来简单讲讲 spring.factories 的作用&#xff0c;以及它是怎么被加载的 简介 位置 以 Sprin…

交换机自动化备份配置(H3C_无人值守)

介绍&#xff1a; 在日常运维过程中&#xff0c;需要定时备份设备的配置&#xff0c;在设备数量过于庞大的情况下&#xff0c;对我们的运维工作会造成极大地不便&#xff0c;通过python自动化能够完美解决人工手动保存设备配置的问题。而且自动化运维在未来也一定是大势所趋&a…

集成电路学习:什么是IEEE电气和电子工程师学会

IEEE&#xff1a;电气和电子工程师学会 IEEE&#xff0c;全称是Institute of Electrical and Electronics Engineers&#xff0c;即电气和电子工程师学会&#xff0c;是一个国际性的电子技术与信息科学工程师的协会&#xff0c;也是目前全球最大的非营利性专业技术学会。IEEE成…

2024版mybatis基础入门学习详情(上)

目录 1、mybatis简介 2、mybatis日志设置 3、取值符号#{}和${}的区别 4、mybatis数据传入 4.1传入单个简单类型 4.2传入实体对象 4.3传入多个简单类型参数 4.4传入Map类型参数 5、mybatis数据返回 5.1返回单个简单类型 5.2返回单个自定义实体类型 5.3返回Map类型 …