• seata的启动与使用


    1 下载seata

    下载地址:https://github.com/seata/seata/releases/v0.9.0/

    1.1 修改配置文件

    将下载得到的压缩包进行解压,进入conf目录,调整下面的配置文件:

    • registry.conf
    1. registry {
    2.  type = "nacos"
    3.  nacos {
    4.    serverAddr = "localhost"
    5.    namespace = "public"
    6.    cluster = "default"
    7.  }
    8. }
    9. config {
    10.  type = "nacos"
    11.  nacos {
    12.    serverAddr = "localhost"
    13.    namespace = "public"
    14.    cluster = "default"
    15.  }
    16. }
    •  nacos-config.txt

    service.vgroup_mapping.service-product=default
    service.vgroup_mapping.service-order=default 

    这里的语法为: service.vgroup_mapping.${your-service-gruop}=default ,中间的
    ${your-service-gruop} 为自己定义的服务组名称, 这里需要我们在程序的配置文件中配置。

    1.3 初始化seata在nacos的配置

    1. # 初始化seata 的nacos配置
    2. # 注意: 这里要保证nacos是已经正常运行的
    3. cd conf
    4. nacos-config.sh 127.0.0.1

    执行成功后可以打开Nacos的控制台,在配置列表中,可以看到初始化了很多Group为SEATA_GROUP的配置。

    1.4 启动seata服务

    1. cd bin
    2. seata-server.bat -p 9000 -m file

    启动后在 Nacos 的服务列表下面可以看到一个名为 serverAddr 的服务。

    2 使用Seata实现事务控制

    2.1 初始化数据表

    在我们的数据库中加入一张undo_log表,这是Seata记录事务日志要用到的表

    1. CREATE TABLE `undo_log`
    2. (
    3. `id`       BIGINT(20)  NOT NULL AUTO_INCREMENT,
    4. `branch_id`   BIGINT(20)  NOT NULL,
    5. `xid`      VARCHAR(100) NOT NULL,
    6. `context`    VARCHAR(128) NOT NULL,
    7. `rollback_info` LONGBLOB   NOT NULL,
    8. `log_status`   INT(11)    NOT NULL,
    9. `log_created`  DATETIME   NOT NULL,
    10. `log_modified`  DATETIME   NOT NULL,
    11. `ext`      VARCHAR(100) DEFAULT NULL,
    12. PRIMARY KEY (`id`),
    13. UNIQUE KEY `ux_undo_log` (`xid`, `branch_id`)
    14. ) ENGINE = INNODB
    15. AUTO_INCREMENT = 1
    16. DEFAULT CHARSET = utf8;

    2.2 添加配置

    在需要进行分布式控制的微服务中进行下面几项配置:
    添加依赖

    1. <dependency>
    2.   <groupId>com.alibaba.cloud</groupId>
    3.   <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
    4. </dependency>
    5. <dependency>
    6.   <groupId>com.alibaba.cloud</groupId>
    7.   <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    8. </dependency>

     DataSourceProxyConfig
    Seata 是通过代理数据源实现事务分支的,所以需要配置 io.seata.rm.datasource.DataSourceProxy 的
    Bean,且是 @Primary默认的数据源,否则事务不会回滚,无法实现分布式事务

     

    1. @Configuration
    2. public class DataSourceProxyConfig {
    3.   @Bean
    4.   @ConfigurationProperties(prefix = "spring.datasource")
    5.   public DruidDataSource druidDataSource() {
    6.     return new DruidDataSource();
    7.  }
    8.   @Primary
    9.   @Bean
    10.   public DataSourceProxy dataSource(DruidDataSource druidDataSource) {
    11.     return new DataSourceProxy(druidDataSource);
    12.  }
    13. }

    registry.conf

    在resources下添加Seata的配置文件 registry.conf

    1. registry {
    2.  type = "nacos"
    3.  nacos {
    4.    serverAddr = "localhost"
    5.    namespace = "public"
    6.    cluster = "default"
    7.  }
    8. }
    9. config {
    10.  type = "nacos"
    11.  nacos {
    12.    serverAddr = "localhost"
    13.    namespace = "public"
    14.    cluster = "default"
    15. }
    16. }

    bootstrap.yaml

    1. spring:
    2. application:
    3.  name: service-product
    4. cloud:
    5.  nacos:
    6.   config:
    7.    server-addr: localhost:8848 # nacos的服务端地址
    8.    namespace: public
    9.    group: SEATA_GROUP
    10.  alibaba:
    11.   seata:
    12.    tx-service-group: ${spring.application.name}

    2.3 在order微服务开启全局事务

    1. @GlobalTransactional//全局事务控制
    2. public Order createOrder(Integer pid) {}

    2.4 测试

    再次下单测试

    3 seata运行流程分析

    要点说明:
    1、每个RM使用DataSourceProxy连接数据库,其目的是使用ConnectionProxy,使用数据源和数据连接代理的目的就是在第一阶段将undo_log和业务数据放在一个本地事务提交,这样就保存了只要有业务操作就一定有undo_log。
    2、在第一阶段undo_log中存放了数据修改前和修改后的值,为事务回滚作好准备,所以第一阶段完成就已经将分支事务提交,也就释放了锁资源。
    3、TM开启全局事务开始,将XID全局事务id放在事务上下文中,通过feign调用也将XID传入下游分支事务,每个分支事务将自己的Branch ID分支事务ID与XID关联。
    4、第二阶段全局事务提交,TC会通知各各分支参与者提交分支事务,在第一阶段就已经提交了分支事务,这里各各参与者只需要删除undo_log即可,并且可以异步执行,第二阶段很快可以完成。
    5、第二阶段全局事务回滚,TC会通知各各分支参与者回滚分支事务,通过 XID 和 Branch ID 找到相应的回滚日志,通过回滚日志生成反向的 SQL 并执行,以完成分支事务回滚到之前的状态,如果回滚失败则会重试回滚操作。

  • 相关阅读:
    大数据毕业设计选题推荐-机房信息大数据平台-Hadoop-Spark-Hive
    开发 Chrome 扩展程序的利弊
    vue3+ts+element 前端实现分页
    着巨大风险!力荐这套「软件安装和环境配置手册」,看了直呼NB
    Oracle11gR2 RAC记录一次ASM磁盘扩容
    贝加莱软件功能测试
    基于图神经网络的图像分类,遥感图像分析
    【英语:基础高阶_经典外刊阅读】L4.阅读填空题一网打尽
    LeetCode力扣刷题——指针三剑客之二:树
    生成动态指定条件的拼接SQL
  • 原文地址:https://blog.csdn.net/Lj_chuxuezhe/article/details/133273672