本文将讲解如果将 Seata 的XA事务模式作为分布式事务解决方案融合到现有的项目中。
在启动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模式的话,只需要在下载好seata-server启动包之后,找到bin目录下启动脚本,直接执行启动命令即可,无需修改任何配置文件。
使用db时,需要
修改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
}
暂未使用过该模式,请查阅资料了解。
<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>
XA模式并不需要建立undo_log表。
Client客户端也需要配置一些参数,可以参考官方给的配置文件示例,如 使用Spring 的配置文件配置 Seata参数示例 、或者使用 conf 文件配置示例
对各个配置参数的说明描述,请查看文档:seata 参数配置
因为seata依赖使用的是seata-spring-boot-starter,所以在使用自动代理数据源时,使用XA模式还需要调整配置文件。
在application.yml文件中添加如下配置:
seata:
data-source-proxy-mode: XA
引入seata-spring-boot-starterjar依赖后,已经内置了GlobalTransactionScanner自动初始化功能。
引入spring-cloud-starter-alibaba-seata依赖后,其内部已经实现xid跨服务传递。
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 仓库](