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

分布式事务以及Seata(XA、AT模式)

目录

一、分布式事务问题:

二、Seata:

TC部署:

微服务集成Seata:

分布式事务-XA模式:

分布式事务-AT模式:


一、分布式事务问题:

        这张图我们可以看到微服务的一个运作,现在假设创建订单、清理购物车这两个步骤没有出现问题,而扣减库存接口报错;由于交易服务调用了库存服务中的方法,因此扣减库存时报错会通知到交易服务,创建订单的事务就会被回滚,也就是1、3回滚;但是购物车服务是被交易服务调用的,购物车服务与库存服务之间并没有直接关系,这就会导致购物车服务的清理购物车事务没有得到回滚而是直接提交;这就会导致数据的不一致性,从业务上看就是提交订单失败但是购物车被清理了;所以就需要引入全局事务来解决该问题

二、Seata:

其实分布式事务产生的一个重要原因,就是参与事务的多个分支事务互相无感知,不知道彼此的执行状态。因此解决分布式事务的思想非常简单:

就是找一个统一的事务协调者,与多个分支事务通信,检测每个分支事务的执行状态,保证全局事务下的每一个分支事务同时成功或失败即可。大多数的分布式事务框架都是基于这个理论来实现的。

Seata也不例外,在Seata的事务管理中有三个重要的角色:

  • TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚。

  • TM (Transaction Manager) - 事务管理器:定义全局事务的范围、开始全局事务、提交或回滚全局事务。

  • RM (Resource Manager) - 资源管理器:管理分支事务,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

其中,TMRM可以理解为Seata的客户端部分,引入到参与事务的微服务依赖中即可。将来TMRM就会协助微服务,实现本地分支事务与TC之间交互,实现事务的提交或回滚。

TC服务则是事务协调中心,是一个独立的微服务,需要单独部署。

那么我们就来部署一下TC服务:

TC部署:

1.Seata支持多种存储模式,但考虑到持久化的需要,我们一般选择基于数据库存储。执行课前资料提供的《seata-tc.sql》,导入数据库表:

2.将整个seata文件夹、以及seata的tar包拷贝到虚拟机的/root目录:

3.加载seata的tar包并创建镜像:

4.确保nacos、mysql都在hm-net网络中并在虚拟机的/root目录执行下面的命令:

通过以下指令查看是否在网络当中:

docker network ls #用于查看所有网络,这里应该要有hm-net
docker inspect mysql #可以查看mysql容器的网络状况,里面应该要有hm-net
docker inspect nacos #可以查看nacos容器的网络状况,里面应该要有hm-net

        这里发现nacos的网络没配置好,我们输入以下指令:

docker network connect hm-net nacos

再次执行docker inspect nacos查看:

接下来就可以执行容器的创建指令了:

docker run --name seata \
-p 8099:8099 \
-p 7099:7099 \
-e SEATA_IP=192.168.150.101 \
-v ./seata:/seata-server/resources \
--privileged=true \
--network hm-net \
-d \
seataio/seata-server:1.5.2

到网页中访问192.168.150.101:7099试试:

微服务集成Seata:

        由于购物车、商品、交易模块要用到Seata,所有我们现在改造这三个模块的代码:

1.引入依赖:

  <!--统一配置管理--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!--读取bootstrap文件--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId></dependency><!--seata--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId></dependency>

2.在nacos上添加一个共享的seata配置,命名为shared-seata.yaml

seata:registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址type: nacos # 注册中心类型 nacosnacos:server-addr: 192.168.150.101:8848 # nacos地址namespace: "" # namespace,默认为空group: DEFAULT_GROUP # 分组,默认是DEFAULT_GROUPapplication: seata-server # seata服务名称username: nacospassword: nacostx-service-group: hmall # 事务组名称service:vgroup-mapping: # 事务组与tc集群的映射关系hmall: "default"

3.给三个模块添加或修改bootstrap.yaml

spring:application:name: *****-service # 服务名称profiles:active: devcloud:nacos:server-addr: 192.168.150.101:8848 # nacos地址config:file-extension: yaml # 文件后缀名shared-configs: # 共享配置- dataId: shared-jdbc.yaml # 共享mybatis配置- dataId: shared-log.yaml # 共享日志配置- dataId: shared-swagger.yaml # 共享日志配置- dataId: shared-seata.yaml # 共享seata配置

4.修改原先的application.yaml文件:

server:port: ****
feign:okhttp:enabled: true # 开启OKHttp连接池支持sentinel:enabled: true # 开启Feign对Sentinel的整合
hm:swagger:title: **服务接口文档package: com.hmall.*****.controllerdb:database: hm-*****

分布式事务-XA模式:

        接下来我们就来实现XA模式:

1.在配置文件中指定要采用的分布式事务模式。我们可以在Nacos中的共享shared-seata.yaml配置文件中设置:

2.在事务的起点方法上添加@GlobalTransactional注解,将来TM就会基于这个方法判断全局事务范围,初始化全局事务。

        以及涉及到的两个方法上添加@Transactional注解

分布式事务-AT模式:

具体实现:

1.在遭遇分布式事务问题的模块下创建快照表存储快照信息:

2.到nacos当中修改shared-seata.yaml:

http://www.dtcms.com/a/495248.html

相关文章:

  • 做网站的 简历标识设计网
  • 平台网站建设意见征求表社区类网站开发
  • 电脑零配件行业MES系统:快速实现全过程信息溯源
  • 基于单片机与上位机的智能宠物喂食管理系统设计
  • 新奇特:黑猫警长的纳米世界,忆阻器与神经网络的智慧
  • 【深度学习新浪潮】LLM 大模型压缩落地实践(2025 版)
  • 神经网络之计算图repeat节点
  • 河北廊坊做网站珠海企业网站设计
  • 网站建设培训 ppt做网站有哪些
  • 【RK3588开发】RKNN库的使用
  • 使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 18--测试框架Pytest基础 2--插件和参数化
  • 玩具 网站模板成立一个网站
  • 阿里网站注册阿里云网站怎么建设
  • 【排查实录】Web 页面能打开,服务器能通接口,客户端却访问失败?原因全在这!
  • 【Linux】系统性能排查:解决卡顿问题
  • 建网站要注意的细节建免费的网站
  • 手机网站建设收费网站建设 合肥
  • Qwen3-0.6模型开关思考模式测试
  • FT62FC3X 8位MCU单片机选型表,详细解析FT62FC31A/32A/33A/35A/3FA
  • 鸿蒙NEXT Sensor Service Kit开发指南:解锁传感器数据的无限潜能
  • 开源项目:FlyCut Caption智能视频字幕裁剪工具
  • Fedora 16上源码建立pydev + eclipse的OpenStack开发环境笔记草稿
  • 便携式榨汁机方案开发,榨汁机果汁机MCU控制方案设计
  • 杭州如何做百度的网站网页是什么
  • 【软考备考】软件架构设计需要考虑系统性能 如何使用缓存提高系统性能知识点七
  • 南京做网站dmooo学校自己做的网站需要买服务器吗
  • 鸿蒙实现可以上下左右滑动的表格-摆脱大量ListScroller
  • 笔试强训:Week -2
  • webpack - 单独打包指定JS文件(因为不确定打出的前端包所访问的后端IP,需要对项目中IP配置文件单独拿出来,方便运维部署的时候对IP做修改)
  • 有的网站打开的是html结尾的路径有的不是wordpress放在二级目录