集成Seata分布式事务

1.版本说明
  1. 注册配置中心为Nacos,官网快速搭建指引:https://nacos.io/zh-cn/docs/quick-start.html
  2. Seata版本:1.4.2,官网地址:https://seata.io/zh-cn/
2.搭建Seata服务端
  • 下载Seata-Server,地址:https://github.com/seata/seata/releases
    点击对应版本,拉取到页面底端,下载红框中的压缩包
    下载软件包

  • 修改配置文件

    这里提供一个小建议,修改Seata配置文件之前,先在nacos上新建一个命名空间,理由是seata会产生一些配置文件,如果没有指定命名空间,默认是public,会让你的配置列表看起来相当杂乱,当然这步并不是必须得,你可以跳过它,但它会让你的配置列表更整洁。
    修改配置文件之前建议先在nacos上新建一个命名空间
    可以按照图中红色步骤添加;也可以看到图中蓝色框中的配置数,如果不指定你得列表肯定会很凌乱,如果你也集成了dubbo也建议这么做,做完此步骤需要记录下生成好的命名空间ID。

    回到正题,首先解压下载好的 seata-server-1.4.2.zip,目录如下:
    在这里插入图片描述
    进入 conf/ 目录下,修改配置文件(file.conf,registy.conf)

    • file.conf 修改(建议先备一份),一共有三个模式可选,(FILE,DB,REDIS)我这里演示的是使用DB模式,先建立一个seata库
      在这里插入图片描述
    • registry.conf 文件修改
      在这里插入图片描述
      如果为seata新建立了命名空间的话,将namespace的值修改成自己的命名空间ID
  • 启动测试,进入bin目录
    Windows的话直接双击seata-server.bat启动 端口号为 8091
    Linux的话可以使用该命令nohup sh seata-server.sh -h 服务器IP -p 自定义端口号 > catalina.out 2>&1 &
    启动后在nacos的服务列表中,可以看到seata-server服务,则表示启动成功,
    在这里插入图片描述
    注意,如果你指定了命名空间的话请先在上方选择命名空间
    在这里插入图片描述

3.将配置导入nacos配置中心
  • 将seata-1.4.2.zip解压,不带server的解压包
    进入 seata-1.4.2\script\config-center目录

  • 修改config.txt文件
    在这里插入图片描述
    修改db的url,user,password

  • 进入nacos目录,我是windows系统,有git,就简单里了,直接在目录右键打开Git Base Here
    在这里插入图片描述
    运行命令:

    sh nacos-config.sh -h XXX.XXX.XXX.XXX -p 8848 -g SEATA_GROUP -t 29bc9448-ac49-499f-a129-808a4758ecaa -u nacos -w nacos
    -h:nacos地址
    -p: 端口,默认8848
    -g: seata的服务列表分组名称
    -t : 命名空间id
    -u和-w:用户名和密码

    执行完成之后在nacos配置列表的seata命名空间下就多出很多的seata自己的配置了

4.导入数据库脚本
  • 导入server的数据库脚本,打开目录 seata-1.4.2\script\server\db
    在这里插入图片描述
    在前边配置的数据库url的那个库执行sql
    在这里插入图片描述
    执行完会有三个表
  • 导入client的数据库脚本,打开目录 seata-1.4.2\script\client\at\db
    在这里插入图片描述
    客户端的需要在你的业务库执行
    在这里插入图片描述
    比如我在我的用户库导入了脚本,生成了undo_log
    至此,我们的seata-server
5.看一下运行测试的效果
  • 添加maven依赖
    <!--分布式事务-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
        <exclusions>
            <exclusion>
                <groupId>io.seata</groupId>
                <artifactId>seata-spring-boot-starter</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>io.seata</groupId>
        <artifactId>seata-spring-boot-starter</artifactId>
        <version>1.4.2</version>
    </dependency>
    
  • 添加配置文件
    spring:
      application:
        name: service-user
    seata:
      enabled: true
      enable-auto-data-source-proxy: true
      tx-service-group: my_test_tx_group
      registry:
        type: nacos
        nacos:
          application: seata-server
          server-addr: nacos的地址
          group: SEATA_GROUP
          username: nacos
          password: nacos
      config:
        type: nacos
        nacos:
          server-addr: nacos的地址
          group: SEATA_GROUP
          username: nacos
          password: nacos
          namespace: nacos的seata的地址
      service:
        vgroup-mapping:
          my_video_group: default
        disable-global-transaction: false
      client:
        rm:
          report-success-enable: false
    
  • 测试代码
    @GlobalTransactional(rollbackFor = {Exception.class},timeoutMills = 6000,name = "testTran")
    public void testSeata(Integer num) throws HelpCustomizeExcepetion {
        //更新need
        Need need = new Need();
        need.setId(1);
        need.setNeedTitle("666");
        updateById(need);
        //更新User
        User user = new User();
        user.setId(1);
        user.setUserName("666");
        userService.updateById(user);
        if(num == 1){
            int a = 1/0;
        }
        //更新 system
        System system = new System();
        system.setId(1);
        system.setName("666");
        systemService.updateById(system);
        if(num == 2){
            int b = 1/0;
        }
    }
    
    根据我的传值来设置抛异常的位置
    首先传num=0
    数据库都更新成功
    传传num=2
    抛出异常,数据库数据未发生改变,回滚成功
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值