Seata集成Nacos加Mysql存储
1、进入seata官网
seata历史版本下载地址

提示:找到对应的版本下载二进制文件即可
2.配置Nacos作为注册中心

一、进入seata\conf目录

提示:可以参考文件application.example.yml来配置我们需要的

二、我最后的yml配置,我采用的Nacos,其中的Nacos变量我是存在了电脑系统变量的
server:port: 7091
spring:application:name: seata-server
logging:config: classpath:logback-spring.xmlfile:path: ${log.home:${user.home}/logs/seata}extend:logstash-appender:destination: 127.0.0.1:4560kafka-appender:bootstrap-servers: 127.0.0.1:9092topic: logback_to_logstash
console:user:username: seatapassword: seata
seata:config:# support: nacos 、 consul 、 apollo 、 zk 、 etcd3type: nacosnacos:server-addr: ${NACOS_SERVER}namespace: ${NACOS_NAMESPACE}group: ${NACOS_GROUP}data-id: ${spring.application.name}.propertiesregistry:type: nacosnacos:application: ${spring.application.name}server-addr: ${NACOS_SERVER}group: ${NACOS_GROUP}namespace: ${NACOS_NAMESPACE}cluster: XYsecurity:secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017tokenValidityInMilliseconds: 1800000ignore:urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.jpeg,/**/*.ico,/api/v1/auth/login,/version.json,/health,/error
三、其中需要注意的是一个cluster这个参数,后面的客服端会用到

3.配置数据库的信息到Nacos的配置中心,
一、这里的文件取名和你在yml配置Config的data-id相关:seata-server.properties
store.mode=db
#-----db-----
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.cj.jdbc.Driver
store.db.url=jdbc:mysql://localhost:3306/seata?useUnicode=true&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
store.db.user=root
store.db.password=123456
# 数据库初始连接数
store.db.minConn=1
# 数据库最大连接数
store.db.maxConn=20
# 获取连接时最大等待时间 默认5000,单位毫秒
store.db.maxWait=5000
# 全局事务表名 默认global_table
store.db.globalTable=global_table
# 分支事务表名 默认branch_table
store.db.branchTable=branch_table
# 全局锁表名 默认lock_table
store.db.lockTable=lock_table
# 查询全局事务一次的最大条数 默认100
store.db.queryLimit=100# undo保留天数 默认7天,log_status=1(附录3)和未正常清理的undo
server.undo.logSaveDays=7
# undo清理线程间隔时间 默认86400000,单位毫秒
server.undo.logDeletePeriod=86400000
# 二阶段提交重试超时时长 单位ms,s,m,h,d,对应毫秒,秒,分,小时,天,默认毫秒。默认值-1表示无限重试
# 公式: timeout>=now-globalTransactionBeginTime,true表示超时则不再重试
# 注: 达到超时时间后将不会做任何重试,有数据不一致风险,除非业务自行可校准数据,否者慎用
server.maxCommitRetryTimeout=-1
# 二阶段回滚重试超时时长
server.maxRollbackRetryTimeout=-1
# 二阶段提交未完成状态全局事务重试提交线程间隔时间 默认1000,单位毫秒
server.recovery.committingRetryPeriod=1000
# 二阶段异步提交状态重试提交线程间隔时间 默认1000,单位毫秒
server.recovery.asynCommittingRetryPeriod=1000
# 二阶段回滚状态重试回滚线程间隔时间 默认1000,单位毫秒
server.recovery.rollbackingRetryPeriod=1000
# 超时状态检测重试线程间隔时间 默认1000,单位毫秒,检测出超时将全局事务置入回滚会话管理器
server.recovery.timeoutRetryPeriod=1000
二、建立事务数据库,文件在seata\script\server\db

4.运行Seata服务seata\bin\seata-server.bat,这里是在windos使用的,所以选的bat
提示:你使用mode为db,可能启动会报错一闪而过,大概是你没有对应的驱动,我在使用mysql的时候就遇到了,把对应的驱动jar添加到lib下面,比如我的就是
![]()
提示:运行成功可以看到you can visit seata console UI on http://127.0.0.1:7091.字样,
一、然后我我们可以在Nacos服务中看看有没有注册成功

二、登录管理界面

提示:密码和账号都是seata,也就是你yml配置的console的user属性
5.客服端使用配置
一、添加yml配置加入事务组
seata:enabled: trueenable-auto-data-source-proxy: falsetx-service-group: seata-xyapplication-id: ${spring.application.name}service:vgroup-mapping:seata-xy: XYregistry:type: nacosnacos:application: seata-serverserver-addr: ${NACOS_SERVER}namespace: ${NACOS_NAMESPACE}group: ${NACOS_GROUP}
二、还需要在那个微服务数据库添加表undo_log
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for undo_log
-- ----------------------------
DROP TABLE IF EXISTS `undo_log`;
CREATE TABLE `undo_log` (`id` bigint NOT NULL AUTO_INCREMENT,`branch_id` bigint NOT NULL,`xid` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,`context` varchar(128) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,`rollback_info` longblob NOT NULL,`log_status` int NOT NULL,`log_created` datetime NOT NULL,`log_modified` datetime NOT NULL,`ext` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE,UNIQUE INDEX `ux_undo_log`(`xid` ASC, `branch_id` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS = 1;
三、如果回滚失败,只回滚了一个需要 Seata 正确代理数据源
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.seata.rm.datasource.DataSourceProxy;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;import javax.sql.DataSource;@Configuration
public class DataSourceConfig {@Bean@ConfigurationProperties(prefix = "spring.datasource")public DataSource dataSource() {return new DruidDataSource();}// 确保 Seata 数据源代理生效@Primary@Bean("dataSourceProxy")public DataSourceProxy dataSourceProxy(DataSource dataSource) {return new DataSourceProxy(dataSource);}
}
6.测试:


