• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Seata实现分布式事务控制

武飞扬头像
JoneClassMate
帮助1

学新通

目录

1. 启动Seata

1.1 下载seata

1.2 修改配置文件及初始化

2. 使用Seata实现事务控制

2.1 初始化数据表

2.2 添加配置


1. 启动Seata

1.1 下载seata

下载地址:https://github.com/seata/seata/releases/v1.3.0/  

1.2 修改配置文件及初始化

将下载得到的seata(非源码包)压缩包进行解压,进入conf目录  

修改file.conf (非源码包)

学新通 

创建数据库Seata并初始化数据表  (源码包)

解压seata-1.4.0源码包,并进入到seata-1.4.0\script\server\db目录,复制运行mysql.sql脚本完成seata服务端数据库初始化工作。  

学新通 

修改registry.conf(非源码包)  

 将下载得到的seata(非源码包)压缩包进行解压,进入conf目录

学新通 

 修改seata-1.4.0(源码包)中script/config-center目录中的config.txt配置:

学新通 

初始化Seata配置到Nacos中  (非源码包)

在seata-1.4.0\script\config-center\nacos目录中右键选择git bash here,运行git命令窗口。并输入以下命令:sh nacos-config.sh -h localhost -p 8848 -g SEATA_GROUP -u nacos -w nacos

学新通 

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

 学新通

启动seata服务(非源码包)

直接进入seata服务的seata\bin目录下,双击运行seata-server.bat文件即可。或者使用以下命令方式运行:

cd bin
seata-server.bat -p 9000 -m file
seata-server.bat -h ip地址 -p 9000 -m file 

学新通 

2. 使用Seata实现事务控制

2.1 初始化数据表

进入源码包seata-1.4.0\script\client\at\db目录,复制并运行mysql.sql数据库脚本完成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 添加配置

  • 添加依赖  

在zmall-order和zmall-product模块中分别引入以下依赖:  

  1.  
    <dependency>
  2.  
    <groupId>com.alibaba.cloud</groupId>
  3.  
    <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
  4.  
    </dependency>
  5.  
    <!-- 如果已经添加了nacos配置中心依赖,则可以不加入 -->
  6.  
    <dependency>
  7.  
    <groupId>com.alibaba.cloud</groupId>
  8.  
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  9.  
    </dependency>
  •  DataSourceProxyConfig

Seata 是通过代理数据源实现事务分支的,所以需要配置io.seata.rm.datasource.DataSourceProxy 的Bean,且是 @Primary默认的数据源,否则事务不会回滚,无法实现分布式事务。请在zmall-order中添加DruidDataSource配置类,具体如下所示:

  1.  
    package com.zking.zmall.config;
  2.  
     
  3.  
    import com.alibaba.druid.pool.DruidDataSource;
  4.  
    import io.seata.rm.datasource.DataSourceProxy;
  5.  
    import io.seata.rm.datasource.xa.DataSourceProxyXA;
  6.  
    import org.springframework.boot.context.properties.ConfigurationProperties;
  7.  
    import org.springframework.context.annotation.Bean;
  8.  
    import org.springframework.context.annotation.Configuration;
  9.  
    import org.springframework.context.annotation.Primary;
  10.  
     
  11.  
    import javax.sql.DataSource;
  12.  
     
  13.  
    @Configuration
  14.  
    public class DataSourceProxyConfig {
  15.  
    @Bean
  16.  
    @ConfigurationProperties(prefix = "spring.datasource")
  17.  
    public DruidDataSource druidDataSource() {
  18.  
    return new DruidDataSource();
  19.  
    }
  20.  
     
  21.  
    @Primary
  22.  
    @Bean("dataSourceProxy")
  23.  
    public DataSource dataSource(DruidDataSource druidDataSource) {
  24.  
    //AT模式
  25.  
    return new DataSourceProxy(druidDataSource);
  26.  
    //XA模式
  27.  
    //return new DataSourceProxyXA(druidDataSource);
  28.  
    }
  29.  
    }
学新通
  •  在启动类上排除DataSource数据源自动配置类
  1.  
    @EnableFeignClients
  2.  
    @EnableDiscoveryClient
  3.  
    @MapperScan({"com.zking.zmall.mapper"})
  4.  
    @SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
  5.  
    public class ZmallOrderApplication {
  6.  
     
  7.  
    public static void main(String[] args) {
  8.  
    SpringApplication.run(ZmallOrderApplication.class, args);
  9.  
    }
  10.  
    }

在需要进行分布式事务的微服务中进行下面几项配置:

  • application.yml  
  1.  
    spring:
  2.  
    datasource:
  3.  
    #type连接池类型 DBCP,C3P0,Hikari,Druid,默认为Hikari
  4.  
    type: com.alibaba.druid.pool.DruidDataSource
  5.  
    driver-class-name: com.mysql.jdbc.Driver
  6.  
    url: jdbc:mysql://localhost:3306/zmall?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
  7.  
    username: root
  8.  
    password: 1234
  9.  
     
  10.  
     
  •  registry.conf

在微服务模块中的resources目录下添加seata的配置文件 registry.conf,该配置文件来自于seata-server/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: my_test_tx_group
  •  在order微服务开启全局事务
  1.  
    @GlobalTransactional //seata全局事务控制
  2.  
    @Transactional
  3.  
    @Override
  4.  
    public Order createOrder(Integer pid, Integer num) {
  5.  
    //根据商品ID修改商品对应的库存
  6.  
    productService.updateStock(pid,num);
  7.  
    //模拟程序执行报错
  8.  
    int i=1 / 0;
  9.  
    //新增订单
  10.  
    Order order=new Order();
  11.  
    //此处只是做模拟操作
  12.  
    this.save(order);
  13.  
    return order;
  14.  
    }

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfhghe
系列文章
更多 icon
同类精品
更多 icon
继续加载