文章目录
自配seata参考文档位置:
- 用户文档 — 事务分组
- 运维指南 — 部署 — 新人文档
- 运维指南 — 部署 — 高可用部署
问题
我的报错内容是:原因二和原因四都触发过。
完整报错信息
ERROR 11940 --- [xxx] [eoutChecker_2_1] i.s.c.r.netty.NettyClientChannelManager : Failed to get available servers: service
.vgroupMapping.default_tx_group configuration item is required
原因一
未配置事务分组。
原因二
后端服务中配置seata的nacos配置 namespace 为public就会报错,需要使用空字符串或者空。
注:后端服务配置中的nacos的命名空间可以使用public,seata服务配置中的nacos的命名空间可以使用public,后端服务中配置seata中的nacos的命名空间需要使用空。
原因三
seata的nacos配置中心使用group:SEATA_GROUP,seata的nacos注册中心使用group:DEFAULT_GROUP时,后端服务nacos引入的seata配置文件group为SEATA_GROUP就会报错,引入group为空就不会报错。
原因四
缓存问题。
是哪里有缓存呢?
是后端服务配置的seata配置有缓存。
缓存会导致什么呢?
缓存会导致出现未知错误,或者已更改配置信息,重启服务后,配置未生效仍然报错。
缓存问题怎么处理呢 ?
修改后端服务配置的seata.service.vgroup-mapping.default_tx_group的值,重启服务,重启完再改回去,再次重启服务,就可以解决(通过修改已缓存配置达到刷新缓存的目的)。
注:配置在nacos注册中心,还是配置在后端服务,更改上述配置文件的位置后重启服务都可以达到解决缓存的目的。
配置参考
版本信息
- jdk 22.0.1
- springboot 3.2.5
- springcloud 2023.0.1
- springcloud alibaba 2023.0.1.0
- seata 2.0
- mysql 8.0.12
seata服务配置文件
注:写的附带有默认配置,可不看
文件位置
seata-server-2.0.0/conf/application.yml
注:官方自带全配置文件位置:seata-server-2.0.0/conf/application.example.yml
配置内容
server:
port: 7091
spring:
application:
name: seata-server
logging:
config: classpath:logback-spring.xml
file:
path: ${log.home:${user.home}/logs/seata}
extend:
logstash-appender:
destination: 127.0.0.1:4560
kafka-appender:
bootstrap-servers: 127.0.0.1:9092
topic: logback_to_logstash
console:
user:
username: seata
password: seata
seata:
#配置中心
config:
type: nacos
#nacos配置中心配置信息
nacos:
server-addr: 127.0.0.1:8848
namespace: public
group: DEFAULT_GROUP
context-path:
#此项可以不加
file-extension: yaml
#data-id: seata.properties
#指向nacos配置中心的seata服务的配置文件(seata服务的配置文件)
data-id: seata.yaml
#注册中心
registry:
type: nacos
#nacos注册中心配置信息
nacos:
application: seata-server
server-addr: 127.0.0.1:8848
namespace: public
group: DEFAULT_GROUP
#事务分组需要对应内容
cluster: default
context-path:
store:
mode: db
lock:
mode: db
session:
mode: db
#数据库连接
db:
datasource: druid
db-type: mysql
#mysql5.x:driverClassName: com.mysql.jdbc.Driver
driver-class-name: com.mysql.cj.jdbc.Driver
url: >
jdbc:mysql://localhost:3306/seata?
useSSL=false&
useUnicode=true&
characterEncoding=utf8&
serverTimezone=GMT%2B8&
allowPublicKeyRetrieval=true&
rewriteBatchedStatements=true
user: root
password: root
min-conn: 10
max-conn: 100
global-table: global_table
branch-table: branch_table
lock-table: lock_table
distributed-lock-table: distributed_lock
query-limit: 1000
max-wait: 5000
# server:
# service-port: 8091 #If not configured, the default is '${server.port} + 1000'
security:
secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
tokenValidityInMilliseconds: 1800000
ignore:
urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.jpeg,/**/*.ico,/api/v1/auth/login,/metadata/v1/**
seata配置文件
说明:
此配置文件包含seata服务的配置文件
和seata相关的配置文件
,可以拆分开。
文件位置
nacos配置中心/seata.yaml
注:官方自带
seata服务的配置文件
全配置文件位置:seata-server-2.0.0/script/config-center/config.txt
nacos配置中心新建seata.yaml配置文件
访问:http://localhost:8848/nacos/
配置管理 — 配置列表 — 创建配置
命名空间:public
Data ID:seata.yaml
Group:DEFAULT_GROUP
配置格式:yaml
配置内容:
配置内容
##seata配置(seata相关的配置文件),配置在服务消费方 & 服务提供方。端口8091,依赖于mysql服务、nacos服务。客户端访问地址:http://127.0.0.1:7091/
seata:
#是否开启springboot自动装配seata,默认为true开启
#enabled: true
#配置事务分组,在v1.5之后默认值为default_tx_group
tx-service-group: default_tx_group
#数据源自动代理
#enable-auto-data-source-proxy: true
#分布式事务模式
#data-source-proxy-mode: AT
service:
#开启全局事务,默认为false开启
#disable-global-transaction: false
#可以不需要
vgroup-mapping:
default_tx_group: default
#client:
#tm:
#default-global-transaction-timeout: 60000
#配置中心
config:
type: nacos
nacos:
#server-addr: 127.0.0.1:8848
server-addr: ${nacos.server-addr}
namespace: ${nacos.namespace}
group: ${nacos.group}
#配置seata的注册中心,告诉seata client怎么去访问seata server(TC)
registry:
type: nacos
nacos:
#seata server所在的nacos地址
#server-addr: 127.0.0.1:8848
server-addr: ${nacos.server-addr}
namespace: ${nacos.namespace}
#seata servers所在的组,默认是SEATA_GROUP,没有修改可以不配
group: ${nacos.group}
#seata server的服务名seata-server,没有修改可以不配
application: seata-server
#context-path:
#username:
#password:
##seata服务配置(seata服务的配置文件)
#事务分组
#主要用于解决异地机房停电容错,可以快速切换事务分组。
#default_tx_group:配置事务的分组名称,可以自定义
#default:必须等于application.yml中 seata.registry.nacos.cluster=default
service:
vgroupMapping:
default_tx_group: default
#开启全局事务,默认为false开启
#disableGlobalTransaction: false
store:
mode: db
lock:
mode: db
session:
mode: db
#数据库连接
db:
dbType: mysql
datasource: druid
#mysql5.x:driverClassName: com.mysql.jdbc.Driver
driverClassName: com.mysql.cj.jdbc.Driver
#mysql5.x
#url: jdbc:mysql://localhost:3306/seata?useUnicode=true&rewriteBatchedStatements=true
#mysql8.x
url: >
jdbc:mysql://127.0.0.1:3306/seata?
useSSL=false&
useUnicode=true&
characterEncoding=utf8&
serverTimezone=GMT%2B8&
allowPublicKeyRetrieval=true&
rewriteBatchedStatements=true
user: root
password: root
minConn: 5
maxConn: 30
globalTable: global_table
branchTable: branch_table
distributedLockTable: distributed_lock
#查询条数
queryLimit: 100
lockTable: lock_table
#最大等待时间
maxWait: 5000
client:
undo:
#事务日志表,默认为undo_log
logoTable: undo_log
server:
undo:
#undo保留天数,默认7天,log_status=1的undo、未正常清理的undo
logSaveDays: 7
依赖引入
注:使用的start方式,seata.io方式有些操作好像需要手动实现。
<!-- SpringCloud Alibaba 微服务的版本管理 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2023.0.1.0</version>
<exclusions>
<exclusion>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</exclusion>
</exclusions>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
或者
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2023.0.1.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
</dependency>
后端服务配置文件
文件位置
src/resources/bootstrap.yml
配置内容
#nacos配置,配置在服务消费方 & 服务提供方。端口8848,nacos配置中心依赖于mysql服务。访问地址:http://localhost:8848/nacos/
#自定义nacos配置信息
nacos:
#nacos服务端地址
server-addr: 127.0.0.1:8848
#环境,默认为:public
namespace: ""
#项目,默认为:DEFAULT_GROUP
group: DEFAULT_GROUP
spring:
# datasource:
# dynamic:
# seata: true
cloud:
nacos:
config:
server-addr: ${nacos.server-addr}
namespace: ${nacos.namespace}
group: ${nacos.group}
#Nacos客户端默认是Properties的文件扩展名,一旦修改成了非Properties格式,则必须通过file-extension进行设置
#设置读取的配置中心文件扩展名,默认为properties
file-extension: yaml
#设置为false时nacos客户端将无法感知配置的变化,默认为true
refresh-enabled: true
shared-configs:
#配置中心的mysql配置引入,不使用此方式可忽略
#- data-id: mysql.yaml
# group: ${nacos.group}
# refresh: true
#配置中心的seata配置引入,需要引入的是后端服务seata配置的部分。(seata相关的配置文件)
- data-id: seata.yaml
group: ${nacos.group}
#配置中心的配置自动刷新,默认为true。
refresh: true
discovery:
server-addr: ${nacos.server-addr}
namespace: ${nacos.namespace}
group: ${nacos.group}
# username: #用户名
# password: #密码
logging:
level:
#打印nacos日志
com.alibaba.cloud.nacos.configdata: debug
mysql数据库内容
1、需要自建seata数据库
创建seata库:
数据库名:seata
字符集:utf8mb4
排序规则:utf8mb4_0900_ai_ci
seata库
global_table:存储全局事务信息
branch_table:存储分支信息(事务参与者信息)
lock_table:存储全局锁
distributed_lock:存储分布式锁
注:seata数据库官方表sql位置:seata-server-2.0.0/script/server/db/mysql.sql
2、在需要使用seata的服务的数据库中,每个数据库新建 undo_log
表
-- 参考sql
-- 时间内容使用 datetime 或者 timestamp 字段
CREATE TABLE `undo_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`branch_id` bigint(20) NOT NULL,
`xid` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`context` varchar(120) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`rollback_info` longblob NOT NULL,
`log_status` int(11) NOT NULL,
`log_created` timestamp NOT NULL,
`log_modified` timestamp NOT NULL,
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `ux_undo_log`(`xid` ASC, `branch_id` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
seata的使用
@GlobalTransactional
总结
报错的原因,要么就是没有配置事务分组,要么就是配置的事务分组无法拿到。(◕ᴗ◕✿)