当前位置: 代码迷 >> 综合 >> SpringCloud Alibaba Senta处理分布式事务
  详细解决方案

SpringCloud Alibaba Senta处理分布式事务

热度:59   发布时间:2023-10-24 05:09:25.0

  分布式事务问题


    分布式前
      单机单库没这个问题
      从1:1 -> 1:N -> N:N
    分布式之后

SpringCloud Alibaba Senta处理分布式事务
    一句话
      一次业务操作需要跨多个数据源或需要跨多个系统进行远程调用,就会产生分布式事务问题


  Seata简介


      Senta是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务
      官网地址
        http://seata.io/zh-cn/
      一个典型的分布式事务过程
        分布式事务处理过程的ID+三组件模型
          Transaction ID全局唯一的事务ID
          三组件概念
            TC - 事务协调者
              维护全局和分支事务的状态,驱动全局事务提交或回滚。
            TM - 事务管理器
              定义全局事务的范围:开始全局事务、提交或回滚全局事务。
            RM - 资源管理器(数据库)
              管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
        处理过程

SpringCloud Alibaba Senta处理分布式事务
   SpringCloud Alibaba Senta处理分布式事务

去哪下
      发布说明: https://github.com/seata/seata/releases
    怎么玩
      本地@Transational
      全局@GlobalTransactional
        seata的分布式交易解决方案

SpringCloud Alibaba Senta处理分布式事务


  Seata-Server安装


    1、官网地址
      https://seata.io/zh-cn/blog/download.html
    2、下载版本
    3、seata-server-0.9.0.zip解压到指定目录并修改conf目录下的file.conf配置文件
      先备份原始file.conf文件
      主要修改:自定义事务组名称+事务日志存储模式为db+数据库连接信息
      file.conf
        service模块
        store模块
    4、mysql5.7数据库新建库seata
    5、在seata库里建表
      建表db_store.sql在\seata-server-0.9.0\seata\conf目录下
        db_store.sql
      sql
    6、修改seata-server-0.9.0\seata\conf目录下的registry.conf配置文件
    7、先启动Nacos端口号8848
    8、再启动seata-server
      \seta\bin\
        seata-server.bat


  订单/库存/账户业务数据库准备


    以下演示都需要先启动Nacos后启动seata,保证两个OK
    分布式事务业务说明
    创建业务数据库
      seata_order:存储订单的数据库
      seata_storage:存储库存的数据库
      seata_account:存储账户信息的数据库
      建库SQL
    按照上诉3库分别建对业务表
      seata_order库下建t_order表
      seata_storage库下建t_storage表
      seata_account库下建t_account表
    按照上诉3库分别建立对应的回滚日志表
      订单-库存-账户3个库下都需要建各自的回滚日志表
      \seata-server-0.9.0\seata\conf目录下的db_undo_log.sql
      建表sql
    最终效果


  订单/库存/账户业务微服务准备


    业务需求
      下订单 -> 减库存->扣余额 ->改(订单)状态
    新建订单Order-Module
      1、seata-order-service2001
      2、POM
        我自己配置新增 0.9.0的seata包时报错了
          com.google.errorprone
          如果你遇到和我一样的错误,建议引入这个包error_prone_core
      3、YML
      4、file.conf
        就是seata文件夹下的file.conf
      5、registry.conf
      6、domain
        CommonResult
        Order
      7、Dao接口及实现
        orderDao
        resources文件夹下新建mapper文件夹后添加
      8、Service接口及实现
        OrderService
        StorageService
        AccountService
        OrderServiceImpl
      9、Controller
      10、Config配置
        MyBatisConfig
        DataSourceProxyConfig
      11、主启动
    新建库存Storage-Module
    新建账户Account-Module


  Test


    数据库初始情况
    下订单->减库存->扣余额->改订单状态
    正常下单
      http://localhost:2001/order/create?userId=1&productId=1&count=10&money=100
      数据库情况
    超时异常,没加@GlobalTransational
      AccountServiceImpl添加超时
      数据库情况
      故障情况
        当库存和账户金额扣减后,订单状态并没有设置为依据完成,没有从零改为1
        而且由于feign的重试机制,账户余额还有可能被多次扣减
    超时异常,添加@GlobalTransational
      结果
      各数据库无记录新增
      OrderServiceImpl


  一部分补充


    Seata
      2019年1月份蚂蚁金服和阿里巴巴共同开源的分布式事务解决方案
      Simple Extensible Autonomous Transaction Architecture ,简单可扩展自治事务框架
      2020起始,参加工作后使用1.0以后的版本
    再看TC/TM/RM三大组件
      分布式事务的执行流程
        TM开启分布式事务(TM向TC注册全局事务记录)
        按业务场景,编排数据库、服务等事务内资源(RM向TC汇报资源准备状态)
        TM结束分布式事务,事务一阶段结束(TM通知TC提交/回滚分布式事务)
        TC汇总事务信息,决定分布式事务是提交还是回滚
        TC通知所有RM提交/回滚 资源,事务二阶段结束
    AT模式如何做到对业务的无侵入
      是什么
      一阶段加载
      二阶段提交
      二阶段回滚
    debug
    补充

  相关解决方案