前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Springboot+Seata整合以及事务模式分析

Springboot+Seata整合以及事务模式分析

作者头像
全栈程序员站长
发布于 2022-10-02 06:32:26
发布于 2022-10-02 06:32:26
50300
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

分布式事务

一、分布式事务的组成部分

  • 事务参与者:对应的一个一个的微服务
  • 资源服务器:对应一个个微服务的数据库
  • 事务管理器:决策各个事务参与者的提交和回滚

两阶段提交:

  1. 准备阶段:向事务管理器向事务参与者发送预备请求,事务参与者在写本地的redo和undo日志,但是不提交,并且返回准备就绪的信息,最后提交的动作交给第二阶段来进行
  2. 提交阶段:如果事务协调者收到失败或者超时的信息,直接给每个参与者发送回滚消息;否则提交消息,最后根据协调者的指令释放所有事务处理过程中使用的资源锁

二、项目例子

当前依赖,全局事务XID,不需要手动进行绑定,自动进行传递

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
<groupId>com.alibaba.cloud</groupId>
&lt;!&ndash;加入spring-cloud-alibaba-seata,解决xid不传递问题&ndash;&gt;
<artifactId>spring-cloud-alibaba-seata</artifactId>
<version>2.2.0.RELEASE</version>
<exclusions>
<exclusion>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</exclusion>
<exclusion>
<groupId>io.seata</groupId>
<artifactId>seata-all</artifactId>
</exclusion>
</exclusions>
</dependency>

全局事务XID需要通过过滤器或拦截器进行手动绑定,否则下游服务获取不到全局XID回滚不了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.3.0</version>
<!-- 这里需要排除自身的seata-all -->
<exclusions>
<exclusion>
<artifactId>seata-all</artifactId>
<groupId>io.seata</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- 导入与之前下载的seata版本一致的包 -->
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-all</artifactId>
<version>1.3.0</version>
</dependency>

OpenFeign进行手动传递XID

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component
public class FeignConfiguration implements RequestInterceptor { 

@Override
public void apply(RequestTemplate requestTemplate) { 

requestTemplate.header("XID", RootContext.getXID());
}
}

提供者手动绑定XID

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component
public class SeataFilter implements Filter { 

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 

HttpServletRequest request = (HttpServletRequest) servletRequest;
//手动绑定XID
String xid = request.getHeader("XID");
if(StringUtils.isNotBlank(xid)){ 

RootContext.bind(xid);
}
filterChain.doFilter(servletRequest,servletResponse);
}
}

seata在1.0.0版本之后就不需要手动进行数据源代理,已经被自动代理

客户端的配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
seata:
enabled: true
tx-service-group: my_first_seata  #配置文件中的事务服务组一样
config:
type: nacos                 # nacos中拉去对应的配置文件
nacos:
server-addr: 192.168.60.46:8849
group: SEATA_GROUP
registry:  # 会去nacos中拉去seata-server服务
type: nacos
nacos:
application: seata-server
server-addr: 192.168.60.46:8849
group: SEATA_GROUP

seata1.0.0之后config文件下就移除了nacos-config.txt等文件,改为了config.txt需要手动下载,并且config.txt需要在nacos-config.sh的上一级目录下才能推送到nacos中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 只需要修改下面几种配置即可,这里是配置客户端需要拉取的配置文件
service.vgroupMapping.自定义的名称=default
store.mode=db #修改为db
store.db.dbType=mysql #修改msql的连接方式账号和密码

三、seata原理

1、角色划分

  • RM:资源管理者/事务参与者,也可以是一个TM
  • TM:事务管理者,也是一个微服务,充当分布式事务的发起者
  • TC:全局事务协调者seata-server,一个包需要搭建,TC来决定事务的回滚和提交

2、AT模式

(1)核心概念
  • 两阶段提交:只执行,不提交
  • seata 核心概念:边执行,边提交(两阶段的变种)
    • 一阶段:查询前置快照———->执行业务语句————–>查询出后置快照,保存只undo_log日志表中
    • 二阶段提交:分支插入待删除队列———>异步删除undo_log表中数据
    • 二阶段回滚:根据配置选项选择是否检验dirty data————>构造方向SQL———–>删除undo_log
(2)执行流程

阶段一:业务SQL:update product set name = ‘GTS’ where name = ‘TXC’

  • 解析SQL,根据update product解析出update语句,表product,条件where等相关信息
  • 查询前置镜像:根据解析sql生成查询语句:select id, name, since from product where name = ‘TXC’
  • 执行业务SQL:update product set name = ‘GTS’ where name = ‘TXC’ 更新数据
  • 查询后置镜像:通过主键定位数据
  • 插入回滚日志:把前后镜像数据以及业务SQL相关的信息组成一条回滚日志记录,插入到undo_log表中
  • 提交前,向TC注册分支,申请product表中,主键值记录的全局锁
  • 本地事务提交:业务数据的更新和前面步骤中生成的undo_log一并提交
  • 将本地事务的提交结果上报给TC

业务数据和回滚日志记录会在同一个本地事务中保存,会释放本地锁和连接资源

阶段二(回滚):

  • 收到TC的分支回滚请求,开启一个本地事务,把请求放入一个异步任务的队列里面
  • 根据XID和Branch ID查找到相应的undo_log记录
  • 数据校验:拿undo_log中的后镜与当前数据进行比较,如果有不同,说明当前数据被其它事务所更改,需要通过配置的策略进行处理
  • 根据undo_log的前置镜像和业务sql的相关信息组成回滚语句
  • 将分支回滚的结果提交给TC

通过一阶段的回滚日志进行反向补偿

阶段二(提交):

  • 收到TC的分支提交请求,把请求放入异步队列中,马上返回提交成功的结果给TC
  • 异步批量的删除undo_log记录
(3)写隔离

一阶段提交本地事务,必须需要拿到更改数据的全局锁,拿不到全局锁,不能提交本地事务,超出等待时间,会回滚本地事务,释放本地锁

例:tx1和tx2两个全局事务同时修改 a表的m字段,m初始为1000;

tx1先开始,拿到本地锁,将m 1000-100 = 900。本地事务提交前,先拿到该记录的全局锁,本地提交释放本地锁。tx2开始,拿到本地锁,将m 900-100=800,提交本地事务前,先获取该记录的全局锁,tx1全局事务提交前,全局锁会被tx1所持有,tx2就会重试等待全局锁。

tx1二阶段全局提交,释放全局锁。tx2拿到全局锁提交本地事务。如果tx1二阶段为全局回滚,那么会重新重试获取本地锁,此时tx2如果还在等待全局锁,同时持有本地锁,tx1分支事务就会等待tx2超时释放本地锁之后,再次获取本地锁;整个过程 全局锁都是被 tx1锁持有,不会存在脏数据的问题

(4)读隔离

Seata AT模式的默认全局隔离级别是读未提交,如果在特定场景下,必需要求全局的读已提交,Seata采用通过select for update 语句来进行代理的;select for update语句的执行会申请全局锁 ,如果全局锁被其它事务锁持有,就会回滚select for update的本地执行并且重试,因为这时候查询是被锁住,直到全局锁拿到,即读取相关的数据是已提交的

3、TCC模式

AT模式是基于本地支持ACID事务的关系型数据库

  • 一阶段prepare行为:在本地事务中,一并提交数据更新和相应的回滚记录
  • 二阶段commit行为:马上成功,自动异步删除回滚记录
  • 二阶段rollback行为:通过回滚日志,自动生成补偿操作,完成数据回滚

相应的TCC模式,不依赖本地底层数据的事务支持:

  • 一阶段prepare行为:调用自定义的prepare逻辑
  • 二阶段commit行为:调用自定义的commit逻辑
  • 二阶段rollback行为:调用自定义的rollback逻辑

4、Saga模式

  • 特点:业务流程中每个参与者都提交本地事务,当某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都由业务开发者实现
  • sage实现:基于状态机引擎来实现
    • 通过状态图来定义服务调用的流程并生成json状态语言定义文件
    • 状态图中一个节点可以是调用一个服务,节点可以配置它的补偿节点
    • 状态图json由状态机引擎驱动执行,当出现异常时状态引擎反向执行已经成功节点对应的补偿节点将事务回滚(用户可以自定义是否进行补偿)
    • 可以实现服务编排需求,支持单项选择、并发、子流程、参数转换、参数映射、服务执行状态判断、异常捕获等功能

5、XA模式

  • 特点:利用事务资源(数据库、消息服务等)对 XA 协议的支持,以 XA 协议的机制来管理分支事务的一种 事务模式

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/191921.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月19日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringCloud Alibaba 实战教程10-seata1.3整合nacos实现分布式事务
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
gang_luo
2021/02/04
8300
SpringCloud Alibaba 实战教程10-seata1.3整合nacos实现分布式事务
「推荐」阿里开源的分布式事务框架 Seata
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
码农架构
2020/10/26
8070
「推荐」阿里开源的分布式事务框架 Seata
25. Seata 介绍及四种模式优缺点
Seata(Simple Extensible Autonomous Transaction Architecture)是一个开源的分布式事务解决方案,旨在解决分布式系统中的事务一致性问题。它为开发者提供了一种简单而可扩展的方式来管理和协调分布式事务。
AI码师
2023/12/15
2.7K0
25. Seata 介绍及四种模式优缺点
seata AT模式流程
Seata 是一款阿里开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案,github地址:https://github.com/seata/seata。
luoxn28
2021/01/28
1.2K0
seata AT模式流程
从分布式事务解决到Seata使用,一梭子给你整明白了
大家好,欢迎来到小菜同学的个人 solo 学堂,知识免费,不吝吸收!关注免费,不吝动手!
蔡不菜丶
2021/04/16
9080
从分布式事务解决到Seata使用,一梭子给你整明白了
Spring Cloud 中的分布式事务,附源码《一》
在开发我的开源项目 prex 时,加入工作流,解决工作流用户与当前系统用户同步问题时,涉及到远程调用操作两个数据库所产生的事务问题,比如系统用户在增加用户同步工作流用户时,系统用户添加成功,工作流用户没有添加成功,则造成数据不一致问题,本地事务无法回滚,那么则使用分布式事务解决方案。
搜云库技术团队
2019/12/02
1.1K0
处理分布式事务(SpringCloud Alibaba Seata)
Seata是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。
鱼找水需要时间
2023/02/16
2640
处理分布式事务(SpringCloud Alibaba Seata)
Seata分布式事务 (理论与部署相结合)
在数据库水平拆分、服务垂直拆分之后,一个业务操作通常要跨多个数据库、服务才能完成。例如电商行业中比较常见的下单付款案例,包括下面几个行为:
不吃紫菜
2023/03/08
1.4K0
Seata分布式事务 (理论与部署相结合)
SpringCloud Alibaba Seata处理分布式事务
分布式之后:   单体应用被拆分成微服务应用,原来的三个模块被拆分成三个独立的应用,分别使用三个独立的数据源,业务操作需要调用三个服务来完成。此时每个服务内部的数据一致性由本地事务来保证,但是全局的数据一致性问题没法保证。
别团等shy哥发育
2023/02/25
2950
SpringCloud Alibaba Seata处理分布式事务
Seata分布式事务落地解决方案
上一篇文章介绍了分布式事务理论和相关解决方案的具体思路,我们下面快速复习一下相关知识点:
大忽悠爱学习
2023/02/13
1K0
Seata分布式事务落地解决方案
seata---分布式事务处理
Seata是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。
大忽悠爱学习
2021/12/07
8440
seata---分布式事务处理
Seata 分布式事务
四、修改 seata-server-0.9.0\seata\conf 目录下的 registry.conf 目录下的 registry.conf 配置文件
BUG弄潮儿
2021/06/25
5720
Seata 分布式事务
Seata 分布式事务
单体应用被拆分成微服务应用,原来的三个模块被拆分成三个独立的应用,分别使用三个独立的数据源,业务操作需要调用三三 个服务来完成。此时每个服务内部的数据一致性由本地事务来保证, 但是全局的数据一致性问题没法保证。
用户9615083
2022/12/25
8330
Seata 分布式事务
Seata--分布式事务
事务指的就是一个操作单元,在这个操作单元中的所有操作最终要保持一致的行为,要么所有操作都成功,要么所有的操作都被撤销。简单地说,事务提供一种“要么什么都不做,要么做全套”机制。
IT小马哥
2021/09/03
3700
Seata--分布式事务
学习分布式事务Seata看这一篇就够了,建议收藏
学习Seata分布式事务看这一篇就够了 一、事务的特性 二、本地事务与分布式事务 三、分布式事务理论依据 3.1、CAP定律 3.2、BASE理论 四、Seata简介 4.1、Seata是什么 4.2、官网地址 4.3、Seata基本架构 4.4、分布式事务解决方案 4.4.1、Seata-AT模式 4.4.2、Seata-XA模式 4.4.2.1、XA模式 什么是XA协议 Seata的事务模式 4.4.2.2、Seata的XA模式 为什么要在Seata中支持XA XA的价值 4.4.2.3、项目中应用XA模式 4.4.2.4、XA模式如何切换 4.4.3、Seata-TCC事务模式 4.4.3.1、什么是TCC 4.4.3.2、Seata的TCC模式 4.4.4、Seata-Saga事务模式 4.4.4.1、基本概念 4.4.4.2、为什么需要Saga 4.4.4.3、Saga状态机 4.4.4.4、Saga状态机设计器 4.5、四种模式的对比 五、部署Seata TC服务 5.1、下载seata-server 5.2、解压修改配置 5.3、初始化数据库配置 5.4、Nacos配置中心添加配置 5.5、测试启动TC服务 六、项目集成Seata 6.1、业务背景 6.2、数据表创建 6.3、搭建基本服务 6.3.1、代码基本结构 6.3.2、pom.xml引入依赖 6.3.3、配置文件application.yml 6.3.4、创建订单接口 6.3.5、声明Feign接口 6.3.6、测试验证 6.4、使用Seata全局事务注解@GlobalTransactional 6.5、配置数据源代理 6.6、启动服务测试
小小Java开发者
2023/11/25
8K0
学习分布式事务Seata看这一篇就够了,建议收藏
SpringCloud Alibaba Seata处理分布式事务
​ 单体应用被拆分成微服务应用, 原来的三个模块被拆分成三个独立的应用,分别使用三个独立的数据源。
OY
2022/03/17
5140
SpringCloud Alibaba Seata处理分布式事务
深度剖析分布式事务,轻松掌握实现原理与应用技巧!
大家好,今天我们来一起探讨分布式事务的相关知识。相信大家都有多多少少接触过分布式事务,因为我们现在写的代码可是服务于亿级用户量级的,那么大的请求量级不可能全部写在一台服务器上面对吧。如果你还没有研究过分布式事务,也没关系,我们今天再一起来探讨一番。我曾经接触过分布式事务相关的中间件框架,比如现在很火的阿里开源的一款分布式事务中间件Seata。目前我在Seata社区主要做一些RPC以及性能优化的相关工作,所以我可能会对分布式事务具体实现比较了解。以Seata为契机,我们一起来探讨分布式事务。
张乘辉
2023/09/02
5170
深度剖析分布式事务,轻松掌握实现原理与应用技巧!
[图文] Seata AT 模式分布式事务源码分析
AT 模式是 Seata 主推的分布式事务解决方案,最早来源于阿里中间件团队发布的 TXC服务,后来成功上云改名 GTS。相较于TCC而言,Seata的AT模式业务侵入性更低,易于接入。
田守枝
2019/07/11
2.5K0
[图文] Seata AT 模式分布式事务源码分析
分布式事务解决方案之Seata管理
前面两篇文章,已经讲解什么是分布式事务,并且讲解了XA协议和TCC三段提交来解决分布式服务,其实这两种方式都是有缺点,要么比较古老,要么实现起来复杂度搞。那么有没有一个第三方框架,能够直接整合到现有项目,直接把本地事务改成全局分布式事务,类似我们使用Transation注解一样。本文就是讲解新的一种解决方案,也就是阿里提出的Seata。
小明爱吃火锅
2023/12/10
5562
看了 5 种分布式事务方案,我司最终选择了 Seata,真香!
好长时间没发文了,最近着实是有点忙,当爹的第 43 天,身心疲惫。这又赶上年底,公司冲 KPI 强制技术部加班到十点,晚上孩子隔两三个小时一醒,基本没睡囫囵觉的机会,天天处于迷糊的状态,孩子还时不时起一些奇奇怪怪的疹子,总让人担惊受怕的。
程序员小富
2020/11/27
5910
看了 5 种分布式事务方案,我司最终选择了 Seata,真香!
推荐阅读
相关推荐
SpringCloud Alibaba 实战教程10-seata1.3整合nacos实现分布式事务
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验