zoukankan      html  css  js  c++  java
  • 十六、Seata

    一、介绍

    参考官网介绍:seata是什么

    本文的代码测试代码仓库:https://gitee.com/summer_wh/spring-cloud-study/tree/Seata/

    二、使用

    1. 下载

    下载地址

    2. 配置文件及数据库

    官方github

    3. 参数配置

    参考官网介绍seata参数配置

    4. 示例配置

    server端

    1.4版本server配置文件
    file.conf文件修改

    把事务存储日志修改为在数据库中存储
    并在数据库中导入mysql文件创建表 mysql文件

    在这里插入图片描述

    registry.conf

    修改默认配置 把seata注册到nacos服务注册中心中
    注意分组可以不修改采用默认也可以

    在这里插入图片描述
    最终结果
    在这里插入图片描述
    在这里插入图片描述

    client端

    在使用分布式事务的全部数据库中添加表mysql文件
    在这里插入图片描述

    file.conf文件

    transport {
      # tcp, unix-domain-socket
      type = "TCP"
      #NIO, NATIVE
      server = "NIO"
      #enable heartbeat
      heartbeat = true
      # the client batch send request enable
      enableClientBatchSendRequest = true
      #thread factory for netty
      threadFactory {
        bossThreadPrefix = "NettyBoss"
        workerThreadPrefix = "NettyServerNIOWorker"
        serverExecutorThread-prefix = "NettyServerBizHandler"
        shareBossWorker = false
        clientSelectorThreadPrefix = "NettyClientSelector"
        clientSelectorThreadSize = 1
        clientWorkerThreadPrefix = "NettyClientWorkerThread"
        # netty boss thread size
        bossThreadSize = 1
        #auto default pin or 8
        workerThreadSize = "default"
      }
      shutdown {
        # when destroy server, wait seconds
        wait = 3
      }
      serialization = "seata"
      compressor = "none"
    }
    service {
      #transaction service group mapping
      #注意这里的分组名
      vgroupMapping.fsp_tx_group = "default"
      #only support when registry.type=file, please don't set multiple addresses
      default.grouplist = "127.0.0.1:8091"
      #degrade, current not support
      enableDegrade = false
      #disable seata
      disableGlobalTransaction = false
    }
    
    client {
      rm {
        asyncCommitBufferLimit = 10000
        lock {
          retryInterval = 10
          retryTimes = 30
          retryPolicyBranchRollbackOnConflict = true
        }
        reportRetryCount = 5
        tableMetaCheckEnable = false
        reportSuccessEnable = false
        sagaBranchRegisterEnable = false
      }
      tm {
        commitRetryCount = 5
        rollbackRetryCount = 5
        defaultGlobalTransactionTimeout = 60000
        degradeCheck = false
        degradeCheckPeriod = 2000
        degradeCheckAllowTimes = 10
      }
      undo {
        dataValidation = true
        onlyCareUpdateColumns = true
        logSerialization = "jackson"
        logTable = "undo_log"
      }
      log {
        exceptionRate = 100
      }
    }
    

    进行过省略一些用不着的配置 只保留nacos和file进行切换配置
    registry.conf 文件

    registry {
      # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
      type = "nacos"
      loadBalance = "RandomLoadBalance"
      loadBalanceVirtualNodes = 10
    
      nacos {
        application = "seata-server"
        serverAddr = "121.89.172.98:8848"
        group = "fsp_tx_group" #注意这个要和nacos中 seata-server的分组名称一样
        namespace = ""
        cluster = "default"
        username = "nacos"
        password = "nacos"
      }
    }
    
    config {
      # file、nacos 、apollo、zk、consul、etcd3
      type = "file"
    
      nacos {
        serverAddr = "127.0.0.1:8848"
        namespace = ""
        group = "SEATA_GROUP"
        username = "nacos"
        password = "nacos"
      }
      file {
        name = "file.conf"
      }
    }
    
    

    5. 注意点:

    1. 找不到服务中心
      在这里插入图片描述
    2. mysql数据库版本问题

    去百度找

    三、测试

    创建订单->调用库存服务扣减库存->调用账户服务扣减账户余额->修改订单状态

    public class OrderServiceImpl implements OrderService {
    
        @Resource
        private OrderDao orderDao;
        @Resource
        private AccountService accountService;
        @Resource
        private StorageService storageService;
    
        /**
         * 创建订单->调用库存服务扣减库存->调用账户服务扣减账户余额->修改订单状态
         * 简单说:
         * 下订单->减库存->减余额->改状态
         * GlobalTransactional seata开启分布式事务,异常时回滚,name保证唯一即可
         * @param order 订单对象
         */
        @Override
        //@GlobalTransactional(name = "fsp-create-order",rollbackFor = Exception.class)
        ///@GlobalTransactional(name = "fsp-create-order", rollbackFor = Exception.class)
        public void create(Order order) {
            // 1 新建订单
            log.info("----->开始新建订单");
            orderDao.create(order);
    
            // 2 扣减库存
            log.info("----->订单微服务开始调用库存,做扣减Count");
            storageService.decrease(order.getProductId(), order.getCount());
            log.info("----->订单微服务开始调用库存,做扣减End");
    
            // 3 扣减账户
            log.info("----->订单微服务开始调用账户,做扣减Money");
            accountService.decrease(order.getUserId(), order.getMoney());
            log.info("----->订单微服务开始调用账户,做扣减End");
    
            // 4 修改订单状态,从0到1,1代表已完成
            log.info("----->修改订单状态开始");
            orderDao.update(order.getUserId(), 0);
            log.info("----->修改订单状态结束");
    
            log.info("----->下订单结束了,O(∩_∩)O哈哈~");
        }
    }
    

    测试一

    没有加 @GlobalTransactional(name = “fsp-create-order”,rollbackFor = Exception.class)注解
    rollbackFor :进行回滚的异常
    name:事务名
    前置条件:
    在这里插入图片描述

    在这里插入图片描述

    http://localhost:2001/order/create?userId=1&productId=1&count=10&money=100
    

    结果:
    在这里插入图片描述
    在这里插入图片描述

    测试二

    添加注解
    @GlobalTransactional(name = “fsp-create-order”, rollbackFor = Exception.class)
    public void create(Order order) {省略}

    初始状态
    在这里插入图片描述
    访问

    http://localhost:2001/order/create?userId=1&productId=1&count=10&money=100
    

    结果
    在这里插入图片描述
    进行回滚 表中记录无变化
    seata表具有回滚记录
    在这里插入图片描述

    四、分析

    在这里插入图片描述
    在这里插入图片描述

    AT模式

    一阶段加载

    在一阶段,Seata会拦截“业务SQL”,

    1. 解析SQL语义,找到“业务SQL”要更新的业务数据,在业务数据被更新前,将其保存成“before
    2. 执行“业务SQL”更新业务数据,在业务数据更新之后,
    3. 其保存成“after image”,最后生成行锁。
      以上操作全部在一个数据库事务内完成,这样保证了一阶段操作的原子性。
      在这里插入图片描述

    二阶段提交

    在这里插入图片描述

    二阶段回滚:

    二阶段如果是回滚的话,Seata就需要回滚一阶段已经执行的“业务SQL”,还原业务数据。
    回滚方式便是用“before image”还原业务数据;但在还原前要首先要校验脏写,对比“数据库当前业务数据”和“after image"如果两份数据完全一致就说明没有脏写,可以还原业务数据,如果不一致就说明有脏写,出现脏写就需要转人工处理。

    在这里插入图片描述

  • 相关阅读:
    盘点 | 2020年金融科技大事记:监管与后疫情
    2020年业务安全领域12大事件
    安装zsh时git太慢,换代理
    springboot 日志处理 aop
    DataPipeline荣获湾区创见·2020网络安全大会 TECHSPARK 十强奖
    PI-S4 Proxy相关配置
    PI-海外银企直联方案
    Mendix-Websites
    crawler-美国GDP数据预测
    AST-web端javascript逆向杀器之认识AST
  • 原文地址:https://www.cnblogs.com/idcode/p/14551364.html
Copyright © 2011-2022 走看看