使用seata来解决分布式事务

文章目录

目录

文章目录

前言

一、Seata的执行流程如下

二、使用步骤

 三、配置微服务客户端

总结



前言

Seata部署指南

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。


一、Seata的执行流程如下

  1. A服务【订单微服务】的TM[事务发起者]向TC[seata服务端]申请开启一个全局事务,TC就会创建一个全局事务并返回一个唯一的XID

  2. A服务开始远程调用B服务【账户微服务】,此时XID会在微服务的调用链上传播

  3. B服务的RM向TC注册分支事务,并将其纳入XID对应的全局事务的管辖

  4. B服务执行分支事务,向数据库做操作

  5. 全局事务调用链处理完毕,TM根据有无异常向TC发起全局事务的提交或者回滚

  6. TC协调其管辖之下的所有分支事务, 决定是否回滚

TM:事务发起者【在哪个方法上添加了全局事务注解的】

TC : 事务管理器【seata的服务端】

RM: 每个操作数据库的微服务

XID: 全局事务id

二、使用步骤

(1)下载seata1.3.0--->

支持集群模式 把开源项目的源码也下一下

 

 

 修改conf/file.conf 让seata集群信息可以共享,我们应该修改它的保存位置:

 

 

 指定seata的注册中心地址和配置中心的内容

registry {
  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
  type = "nacos"

  nacos {
    application = "seata-server"
    serverAddr = "127.0.0.1:8848"
    group = "SEATA_GROUP"
    namespace = "88aa134e-24e9-45ab-a336-6ba2ce63a913"
    cluster = "default"
    username = "nacos"
    password = "nacos"
  }
  eureka {
    serviceUrl = "http://localhost:8761/eureka"
    application = "default"
    weight = "1"
  }
  redis {
    serverAddr = "localhost:6379"
    db = 0
    password = ""
    cluster = "default"
    timeout = 0
  }
  zk {
    cluster = "default"
    serverAddr = "127.0.0.1:2181"
    sessionTimeout = 6000
    connectTimeout = 2000
    username = ""
    password = ""
  }
  consul {
    cluster = "default"
    serverAddr = "127.0.0.1:8500"
  }
  etcd3 {
    cluster = "default"
    serverAddr = "http://localhost:2379"
  }
  sofa {
    serverAddr = "127.0.0.1:9603"
    application = "default"
    region = "DEFAULT_ZONE"
    datacenter = "DefaultDataCenter"
    cluster = "default"
    group = "SEATA_GROUP"
    addressWaitTime = "3000"
  }
  file {
    name = "file.conf"
  }
}

config {
  # file、nacos 、apollo、zk、consul、etcd3
  type = "nacos"

  nacos {
    serverAddr = "127.0.0.1:8848"
    namespace = "88aa134e-24e9-45ab-a336-6ba2ce63a913"
    group = "SEATA_GROUP"
    username = "nacos"
    password = "nacos"
  }
  consul {
    serverAddr = "127.0.0.1:8500"
  }
  apollo {
    appId = "seata-server"
    apolloMeta = "http://192.168.1.204:8801"
    namespace = "application"
  }
  zk {
    serverAddr = "127.0.0.1:2181"
    sessionTimeout = 6000
    connectTimeout = 2000
    username = ""
    password = ""
  }
  etcd3 {
    serverAddr = "http://localhost:2379"
  }
  file {
    name = "file.conf"
  }
}

 

 然后

然后 

 三、配置微服务客户端

 在每个微服务中添加seata依赖

   <!--seata 一定要保证和seata服务的版本匹配-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
        </dependency>

修改配置文件

 

最后要在需要的业务层 添加全局事务 当做tm

@GlobalTransactional //全局事务 tm队长 全局事务
回滚其他微服务连接数据库。
    public void saveOrder(Order order) {

 log.info("-------->开始创建新订单");
        orderDao.saveOrder(order);

        log.info("-------订单微服务开始调用账户,做扣减");
        accountFeign.increase(order.getUserId(),order.getMoney()); //事务提交
        log.info("-------订单微服务开始调用账户,做扣减end");
        int c=10/0;
        log.info("--------订单微服务开始调用库存,做扣减");
        storageFeign.increase(order.getProductId(),order.getCount());
        log.info("-------订单微服务开始调用库存,做扣减end");


        log.info("-------修改订单状态");
        orderDao.updateStatus(order.getId());

        log.info("-------修改订单状态结束");

        log.info("--------下订单结束了,哈哈哈哈");



}


总结

猜你喜欢

转载自blog.csdn.net/qq_55648724/article/details/129148919