集成Seata分布式事务到项目中(一)

本文将讲解如果将 SeataXA事务模式作为分布式事务解决方案融合到现有的项目中。


Server配置与启动

认识存储模式(store.mode)

在启动server前,需要了解一下 server 的存储模式(store.mode)。

seata目前提供有file、db、redis三种模式。

  • file

    file模式无需改动,直接启动即可。

    file模式为单机模式,全局事务会话信息内存中读写并持久化本地文件root.data,性能较高;

  • db

    需要在库中建立三张表:global_table(全局事务表)、branch_table(分支事务表)、lock_table(全局锁表)

    该模式为高可用模式,全局事务会话信息通过db共享,相应性能差些;

  • redis

    Seata-Server 1.3及以上版本支持,性能较高,存在事务信息丢失风险,需要提前配置合适当前场景的redis持久化配置.

以上三种存储模式的配置,在 seata-server 启动包中 conf 目录下的 file.conf 文件中。路径为:
seata-server-1.4.2 --> conf --> file.conf , 其中的 store.mode参数。

各模式对应步骤

场景一:使用的是file模式

使用file模式的话,只需要在下载好seata-server启动包之后,找到bin目录下启动脚本,直接执行启动命令即可,无需修改任何配置文件。

场景二:使用的是db模式

使用db时,需要

  • 步骤一:修改server的file.conf配置文件
  • 步骤二:在数据库中建立三张表:global_table(全局事务表)、branch_table(分支事务表)、lock_table(全局锁表)

修改store.mode参数,指定具体的存储模式为db;然后根据使用的存储模式修改对应的参数,store.db

以使用db模式为例,参数如下:

  ## db存储模式参数设置
  db {
    ## javax.sql.DataSource的实现, 比如DruidDataSource(druid)/BasicDataSource(dbcp)/HikariDataSource(hikari) 等等。
    datasource = "druid"
    ## 使用的数据库类型。如mysql/oracle/postgresql/h2/oceanbase等等。
    dbType = "mysql"
    ## 如果使用的mysql8,需要将该参数值设为:com.mysql.cj.jdbc.Driver
    driverClassName = "com.mysql.jdbc.Driver"
    ## 将url、user、password三个参数设置成自己的数据库
    ## 如果使用的是mysql存储数据,推荐将 rewriteBatchedStatements=true 放到jdbc连接参数中。
    url = "jdbc:mysql://127.0.0.1:3306/seata?rewriteBatchedStatements=true"
    user = "mysql"
    password = "mysql"
    minConn = 5
    maxConn = 100
    ## 指定使用的全局事务表、分支事务表、全局锁表表名
    globalTable = "global_table"
    branchTable = "branch_table"
    lockTable = "lock_table"
    queryLimit = 100
    maxWait = 5000
  }
场景三:使用的是redis模式

暂未使用过该模式,请查阅资料了解。


Client客户端配置

添加依赖

  • spring-cloud-starter-alibaba-seata推荐依赖配置方式如下:
           <dependency>
                <groupId>io.seatagroupId>
                <artifactId>seata-spring-boot-starterartifactId>
                <version>最新版version>
            dependency>
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-starter-alibaba-seataartifactId>
                <version>2.2.1.RELEASEversion>
                <exclusions>
                    <exclusion>
                        <groupId>io.seatagroupId>
                        <artifactId>seata-spring-boot-starterartifactId>
                    exclusion>
                exclusions>
            dependency>

undo_log建表

XA模式并不需要建立undo_log表。

配置参数

Client客户端也需要配置一些参数,可以参考官方给的配置文件示例,如 使用Spring 的配置文件配置 Seata参数示例 、或者使用 conf 文件配置示例

对各个配置参数的说明描述,请查看文档:seata 参数配置

数据源代理

因为seata依赖使用的是seata-spring-boot-starter,所以在使用自动代理数据源时,使用XA模式还需要调整配置文件。

在application.yml文件中添加如下配置:

seata:
  data-source-proxy-mode: XA

初始化GlobalTransactionScanner

引入seata-spring-boot-starterjar依赖后,已经内置了GlobalTransactionScanner自动初始化功能。

实现xid跨服务传递

引入spring-cloud-starter-alibaba-seata依赖后,其内部已经实现xid跨服务传递。


注意事项

导入seata依赖与项目本身依赖可能产生的冲突问题

Seata依赖本身会引入一些传递依赖进入项目,如果项目中的其他依赖版本与Seata引入的依赖版本之间有差异,可能会产生冲突。

这个问题也好解决,找到符合条件的对应版本替换原有的依赖版本即可解决冲突。

事务分组的问题

Client客户端中的 application.yml 配置文件中还需要添加下面一行配置:

seata:
  tx-service-group: my_test_tx_group

如果没有配置该参数,项目启动时会在日志控制台中不断输出以下内容:

can not get cluster name in registry config 'service.vgroupMapping.xxxxxx-seata-service-group', please make sure registry config correct

其中xxxxxx对应你的spring.application.name

参考seata官网文档:事务分组专题


参考

Seata官方文档-部署-新人文档-部署指南

分布式事务如何实现?深入解读 Seata 的 XA 模式

[Seata 官方 Github 仓库](

你可能感兴趣的:(微服务组件,分布式)