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

SpringCloud学习:Seata分布式事务处理

文章目录

  • SpringCloud学习:Seata分布式事务处理
    • 1. 面试题
    • 2. 分布式事务问题如何产生
    • 3. Seata简介:分布式事务解决方案
    • 4. Seata工作流程简介
    • 5. Seata-Server2.0.0安装
    • 6. Seate实战-数据库和表准备
    • 7. Seata实战-微服务编码落地实现

SpringCloud学习:Seata分布式事务处理

1. 面试题

  1. 多个数据库之间如何处理分布式事务?如何保障分布式事务一致性?
    1. 使用全局事务,TC就是Seata微服务,TM就是全局事务,RM就是分支业务
  2. alibaba的Seate-AT模式如何做到对业务的无侵入?
  3. 分布式事务的方案有哪些

2. 分布式事务问题如何产生

  1. 在微服务架构下,微服务的一次调用可能会有一个调用链,对多个微服务执行事务操作,此时就会出现不一致性问题,因为各个数据库的内部数据由本地事务进行一致性处理
  2. 在微服务架构下要解决多个数据库的分布式事务,独立数据库的一致性通过单机事务实现
  3. 一次业务操作要多个数据源远程调用,就会产生一致性问题,而数据库是基于单机事务的,不支持分布式事务场景,故要通过其他技术来实现分布式事务
  4. 各个数据库源是独立的,内部数据一致性由本地事务来保证,但是全局的数据一致性无法保证,要使用全局事务

3. Seata简介:分布式事务解决方案

  1. 是什么:简单(Simple)可扩展(Extensible)自治(Autonomous)事务(Transaction)框架(Architecture)
  2. 能干嘛:分布式事务解决方案致力于在微服务架构下提供高性能和简单易用的分布式事务服务
  3. 官网:www.seata.io
  4. 怎么用
    1. 使用内置的注解:@Transaction和@GlobalTransaction
    2. 分布式事务交易解决方案

4. Seata工作流程简介

  1. 分布式事务的管理,就是全局事务XID的传递和变更,分布式事务的管理,就是对全局事务XID的传递和管理
  2. TM向TC申请一个全局事务XID,然后对其之后调用的所有微服务传入XID,在微服务中使用RM向TC创建分支事务进行数据库操作,若有一个分支事务出现故障,则由TC对整个XID上的事务进行回滚
  3. 一个分布式事务就是一个全局事务,组织安装和配置多个分支事务(各个数据库的本地事务)
  4. Seata对分布式事务的协调和控制就是1+3
    1. 1个XID:全局事务的唯一标识,在服务的调用链路中传递,绑定到事务上下文
    2. 3个概念:TC->TM->RM
    3. 三个组件相互协作,TC就是Seata,以Seata服务器(server)形式部署,并有一个控制台7091TM(标注全局事务注解的微服务,是整个事务的入口决定事务的范围TM也是RM)和RM(数据库)则是以SeataClient形式集成在微服务中
    4. TC就是Seata server,是独立部署的一个微服务,TM和RM都是业务微服务中进行配置的,对于整个全局事务的入口,配置为TM,其余微服务配置为RM
    5. 而且因为Seata是独立部署的,故为实现一致性,必须为Seata微服务创建专属的数据库seata和表(从官网上找),并在seata的config文件进行配置
  5. 分布式事务的执行流程
    1. TM先向TC申请一个全局事务XID,此时由TM决定事务范围,调用哪些微服务实现业务,XID会随着请求调用进行传递,传到一个微服务中,RM向TC注册分支事务将其纳入XID对应全局事务的管辖,最后由TM向TC发起针对全局事务XID的全局提交或者回滚由TC调度XID的全部分支事务进行提交或回滚
  6. 各个事务的模式
    1. Seata AT模式:自动提交模式,此时必须在各个微服务的数据库中创建undo_log回滚表

5. Seata-Server2.0.0安装

  1. 官网:www.seata.io,去github上下载源码和文件
  2. 部署指南:Seata分TC、TM、RM三个角色,TC(server)为单独服务器端部署TM和RM由业务客户端系统集成;Seata就是微服务,独立部署,为保证数据一致性,要为seata创建专属的库和表,并在seata/config文件夹内根据环境对Seata进行配置,配置后再启动
  3. TC就是Seata服务器,是独立部署的,TM和RM都是在微服务上进行部署,TM就是全局事务入口,并指定事务的范围,RM就是分支事务,TM、RM均要向TC发出事务申请
  4. mysql8.0数据库里面建库+建表
    1. 不推荐MySQL放在Docker里面
    2. TC就是Seata seaver本身为保证数据稳定必须有专属的数据库(seata)和表,并且要对其config进行配置
    3. 先创建数据库seata,再在seata库下执行官网的sql脚本来创建必须的表(global_table…)
  5. 更改配置:下载的seata文件夹内的配置config
    1. 根据自己的环境修改seata/config/application.yml中的配置,如store_mode以及注册进入Nacos等
  6. 启动:因为seata作为单独微服务且配置中要注册进入Nacos,故先启动Nacos(starp…)再启动Seata,要先启动Nacos再启动Seata
    1. 先开启8848Nacos控制台看能不能发现seata微服务,再启动7091控制台进入seata

6. Seate实战-数据库和表准备

  1. 创建业务数据库
  2. 创建对应的undo_log回滚日志表Seata-AT模式
    1. 要为Seata创建专属的特殊的数据库和表,并修改config配置,然后先启动Nacos再启动Seata,seata作为独立的微服务启动
    2. Seata-AT是自动回滚模式,为实现这一功能,必须要记录回滚前的值,故要为每个微服务的数据库中创建一个undo_log回滚表,sql代码去官网找
    3. Seata-AT模式是AutoTransaction自动回滚模式,故AT模式必须要为每个业务库设置undo_log回滚表
    4. 当全局事务失败后会回滚,故要记住之前的数据是什么,每个业务库都要创建一个undo_log回滚表具体的sql代码去官网上找
  3. 创建对应的业务表

7. Seata实战-微服务编码落地实现

  1. 业务需求
    1. 以后创建一个订单时,会先判断用户余额和商品库存是否满足,当满足后首先修改用户余额和商品库存,然后生成订单写入数据库,此时会分布式的访问多个数据库,故要使用分布式事务保证数据的一致性![[Pasted image 20241018184638.png]]
  2. Mybatis一键生成
    1. 在Mybatis-generator中一键生成entity和mapper
  3. 修改公共api,创建账户和库存两个微服务的api
  4. 创建order微服务
    1. 建项目:约定>配置>编码
    2. 改POM
      1. 要注册进入Nacos,要使用Seata分布式事务,要使用Openfeign服务调用,要引入以上的所有依赖
    3. 写YML
      1. 要根据环境对微服务的Seata进行配置新版本的seata要使用default_tx_group事务组,与默认的TC服务集群进行映射
      2. 对微服务所用的Nacos、Openfeign和Seata进行配置
    4. 主启动
      1. 要对主启动类添加@SpringbootApplication(设置为springboot启动类)、@MapperScan(扫描所有注解标注的包)、@EnableDiscoveryClient(注册进入Nacos)、@EnableFeignClients(开启openfeign)注解以
    5. 业务类
      1. 根据业务需求创建controller调用service接口(要创建serviceImpl实现类),再调用DAO持久层
      2. 在java下创建mapper文件夹,里面存放各个entity对应的对数据库的操作方法接口,然后在resource文件夹内创建mapper文件夹,并对每个mapper接口设置指定的XXXmapper.xml以对每个接口方法生成对应的SQL语句
    6. 分布式事务实现
      1. 当一个方法要调用多个微服务时,且存在多个数据库的操作,则此时必须要使用分布式事务,要在该方法(最起始的方法)上加上@globalTransaction注解标注

http://www.kler.cn/news/356464.html

相关文章:

  • Nature 正刊丨核糖体如何塑造蛋白质折叠
  • python安装(基于pycharm的安装平台)2024年10月
  • 【微信小程序_14_页面导航】
  • Linux概述
  • Python 小高考篇(1)基本输入输与运算
  • [A-13]ARMv8/ARMv9-Memory-虚拟地址翻译(页表映射过程)
  • nginx过滤模块怎么生效的
  • c++基础知识1
  • wpf 窗口关闭前 弹出提示窗口
  • CPP-TCP80优化
  • Python知识点:基于Python工具,如何使用Brownie进行智能合约测试
  • R语言复杂抽样调查数据统计描述和分析
  • Vue-admin-box后台管理框架
  • Leetcode 1 的位数
  • 文字跑马灯:实现文字自动滚动策略的原理分析
  • TwinCAT3添加NC轴
  • Text2Video Huggingface Pipeline 文生视频接口和文生视频论文API
  • 【微服务】微服务发现详解:构建高效分布式系统的关键
  • c# 里list和array的应用比较说明
  • SwanLab VSCode插件已发布,附使用教程