当前位置: 首页 > news >正文

SpringCloud Seata集成分布式事务管理 事务保护 XA AT两种模式的区别

介绍

阿里巴巴的 Seata(Service Aligned Transaction Alternative)是一个开源的分布式事务解决方案,旨在解决微服务架构中跨服务、跨数据库的事务一致性问题。它可以帮助开发者管理分布式系统中的全局事务,确保在多个服务之间的事务一致性。

引入依赖

<!--seata-->
<dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><version>1.6.1</version>
</dependency>

配置

每个服务中引入

seata:registry: #注册中心的配置type: nacos #注册中心类型为nacosnacos:server-addr: 172.23.4.128:8848 #服务注册地址namespace: "" #命名空间group: DEFAULT_GROUP #默认DEFAULT_GROUPapplication: seata-server #服务名称tx-service-group: test #事务组名称service:vgroup-mapping: #事务与组的映射关系test: "default"

XA模式

  • 阶段1:预提交阶段
    参与事务的各个资源(如数据库)会锁定事务需要的资源并准备执行。此时,Seata 会询问每个参与者是否可以提交,参与者进行本地准备并响应是否可以提交。

  • 阶段2:提交或回滚阶段
    如果所有参与者都可以提交(即没有遇到错误),Seata 会发出全局提交请求;否则,发出回滚请求。

  • 事务一致性:采用 XA 协议保证跨多个资源的事务的一致性,确保事务在分布式环境中能实现原子性操作。

  • 资源协调:Seata 作为事务协调者,协调所有参与资源的提交与回滚,确保最终一致性。

  • 回滚与补偿:若事务失败,Seata 会确保通过回滚来恢复到事务开始前的状态。

  • 支持的数据库:Seata XA模式支持通过 XA 协议的数据库,常见的如 MySQL、Oracle 等,前提是这些数据库支持 XA 协议。

缺点
性能开销:XA 模式的两阶段提交协议需要多次通信和锁定资源,可能会导致性能下降,特别是在大规模、高并发的场景中。
支持的资源类型较少:XA 协议主要支持数据库等传统资源,对于一些新型的分布式资源(如消息队列、缓存等)可能支持不够好,或者实现较复杂。

开启XA模式
在全局配置中添加

seata:data-source-proxy-mode: XA #开启XA模式

开启事务

    @GetMapping("/pay")@GlobalTransactionalpublic SaResult pay(){//假设余额扣减String userId=StpUtil.getLoginIdAsString();LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();updateWrapper.eq(User::getId, userId)  // 根据用户ID进行查询.setSql("play_num = play_num - 1");  // 扣减play_numberuserService.update(updateWrapper);if(true){  //模拟报错int i = 1 / 0;}goodsClient.delete();//删除return SaResult.ok();}

相关的服务也需要 @Transient

   @DeleteMapping("/delete")@Transientpublic Boolean delete(){return  goodsService.removeById(1);}

这里进行了两次SQL,一次是自己的user库,一个是远程调用的微服务。如果其中一个报错了都会保证数据的一致性。


AT模式

主推的是AT模式,AT模式同样是分阶段提交的事务模型,缺弥补了XA模型中资源锁定周期过长的缺陷。AT模式会导致几毫秒的数据不一致因为立马提交了SQL语句。
运行步骤:
阶段一:注册事务分支->记录undo-log(数据快照) ->执行业务SQL并提交
阶段二:删除undo-log(数据快照)
在这里插入图片描述

因此如果使用AT模式需要给每一个微服务都添加undo-log表。

相关文档:https://seata.apache.org/zh-cn/docs/v1.5/overview/what-is-seata

创建undo-log

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;

修改AT模式
data-source-proxy-mode: AT
去除默认就是AT模式

seata:data-source-proxy-mode: AT

SQL日志
事务开始时会先记录快照如果报错就会回滚。
在这里插入图片描述
在这里插入图片描述

如何选择模式

如果对业务一致性高的话选择XA模式会对数据库进行锁表,对于性能要求选择AT模式,AT模式会导致几毫秒的数据不一致因为立马提交了SQL语句。

http://www.lryc.cn/news/496286.html

相关文章:

  • node.js基础学习-querystring模块-查询字符串处理(三)
  • 电子电气架构 --- 车载网关GW连接外部IP Tester
  • 鸿蒙LiteOS的核心架构
  • C语言——实现计算房屋总价
  • 【380】基于springboot的闲置图书分享
  • element-ui的下拉框报错:Cannot read properties of null (reading ‘disabled‘)
  • VMware虚拟机——安装保姆级教程(附安装包)
  • 如何实现表格选中时禁用树结构的复选框功能(El-Tree 与 El-Table 联动实现)
  • STM32CUBEIDE FreeRTOS操作教程(十):interrupt on/off中断开关
  • Linux的基本操作及虚拟机设置
  • oracle 用户手册
  • Flutter-Web打包后上线白屏
  • 解决linux访问huggingface的问题(操作记录)
  • Android Studio 右侧Gradle窗口只有test的task问题解决
  • Spring AOP 的实现和切点表达式的介绍
  • 【赛博保安】安全日记之常用术语(一)
  • C++ 中的 string 类:全面解析与应用实践(上)
  • 量化交易系统开发-实时行情自动化交易-8.7.文华平台
  • 美畅物联丨如何通过 FFmpeg 解码视频
  • 机器学习任务功略
  • Web Worker 和 WebSocket的区别
  • JMeter实时性能压测可视化系统整合
  • 无限加载和懒加载及路由滚动及路由滚动不生效
  • CSS底层基础:小白速来
  • 【MySQL 进阶之路】索引概述
  • 【C++boost::asio网络编程】有关异步读写api的笔记
  • Elasticsearch 的存储与查询
  • 008静态路由-特定主机路由
  • SystemUI 下拉框 Build 版本信息去掉
  • 【JS】栈内存、堆内存、事件机制区别、深拷贝、浅拷贝