seata官方文档:http://seata.io/zh-cn/docs/overview/what-is-seata.html
1.准备
数据库
borrow-service:
BorrowController
BorrowServiceImpl
BorrowDao
UserClient
BookClient
user-service:
UserController
UserServiceImpl
UserDao
book-service:
BookController
BookServiceImpl
BookDao
测试:因为uid=1已经借阅过bid=1的书了,因此会报错,但是book表的count还会减一,并没有事务控制,需要有seata来做事务控制。
2、下载服务端
https://github.com/seata/seata/releases
下载源码:https://github.com/seata/seata/archive/refs/heads/develop.zip
3、配置部署
把seata-server-1.4.2.zip解压后放到spring_cloud_study中
在edit中创建batch,并且配置
直接右键运行.bat也会自己创建个batch配置
运行
我们把各个服务作为seata的客户端,导入依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-seata</artifactId> </dependency>
并且添加配置,用userservice举例子
application.yml
分组名称按服务名称来做设置
seata: service: vgroup-mapping: # 这里需要对事务组做映射,默认的分组名为 应用名称-seata-service-group,将其映射到default集群 # 这个很关键,一定要配对,不然会找不到服务 userservice-seata-service-group: default grouplist: default: localhost:8868
全application.yml
server: port: 8101 # 配置数据源信息 spring: application: name: userservice datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/cloudstudy?characterEncoding=utf-8 username: root password: root cloud: nacos: discovery: # 配置Nacos注册中心地址 server-addr: localhost:8848 cluster-name: Chongqing namespace: f34784a5-ec4d-4659-a907-f464a4ff7aaf sentinel: transport: # 添加监控页面地址 dashboard: localhost:8858 seata: service: vgroup-mapping: # 这里需要对事务组做映射,默认的分组名为 应用名称-seata-service-group,将其映射到default集群 # 这个很关键,一定要配对,不然会找不到服务 userservice-seata-service-group: default grouplist: default: localhost:8868
现在就可以直接启动了,但是现在只是单纯的连接上,并没有开启任何的分布式事务
在启动类添加注解,此注解会添加一个后置处理器将数据源封装为支持分布式事务的代理数据源(虽然官方表示配置文件中已经默认开启了自动代理,但是这个1.4.2版本只能打注解的方式生效)
给三个服务都加上注解@EnableAutoDataSourceProxy
重启
连接上后把业务放在分布式事务里边
在需要事务的业务上边加@GlobalTransactional注解
重启
在数据库中创建一个undo_log表
CREATE TABLE `undo_log` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `branch_id` bigint(20) NOT NULL, `xid` varchar(100) NOT NULL, `context` varchar(128) NOT NULL, `rollback_info` longblob NOT NULL, `log_status` int(11) NOT NULL, `log_created` datetime NOT NULL, `log_modified` datetime NOT NULL, `ext` varchar(100) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
重启测试,在borrow表中有uid=1,bid=2时,发出借阅请求,报错后book表和user表还是原来的数据
4、使用nacos模式部署
在nacos中新建一个命名空间
详细(跟这个步骤走):
(36条消息) seata 整合 nacos(windows)_seata nacos_小菜鸡9527的博客-CSDN博客
https://blog.csdn.net/weixin_45927841/article/details/125351324?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168327337716800213014627%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168327337716800213014627&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-125351324-null-null.142^v86^insert_down28v1,239^v2^insert_chatgpt&utm_term=%E5%B0%8F%E8%8F%9C%E9%B8%A19527&spm=1018.2226.3001.4187
结果就是配置文件在nacos中
注意:数据库配置地址要写对,尤其是nacos中store.db.url的数据库配置,ip:端口,不是ip/:端口
注意:seata 启动时 数据库连接报错 'serverTimezone'[时区]识别错误, 数据库链接后追加: &serverTimezone=UTC
nacos中做配置管理
新建配置(一共三个服务,也就是三个配置,Data ID分别是service.vgroupMapping.bookservice-seata-service-group、service.vgroupMapping.borrowservice-seata-service-group、service.vgroupMapping.userservice-seata-service-group,配置内容都是default)
服务里边做配置
application.yml中将之前本地配置改为(三个服务一样,注意改namespace,这个就是命名空间id)
seata: # 注册 registry: # 使用nacos type: nacos nacos: namespace: 6c3b0720-5a38-4e78-ac5a-56d70128ec1e username: nacos password: nacos # 配置 config: type: nacos nacos: namespace: 6c3b0720-5a38-4e78-ac5a-56d70128ec1e username: nacos password: nacos
完整
server: port: 8101 # 配置数据源信息 spring: application: name: userservice datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/cloudstudy?characterEncoding=utf-8 username: root password: root cloud: nacos: discovery: # 配置Nacos注册中心地址 server-addr: localhost:8848 cluster-name: Chongqing namespace: f34784a5-ec4d-4659-a907-f464a4ff7aaf sentinel: transport: # 添加监控页面地址 dashboard: localhost:8858 seata: # 注册 registry: # 使用nacos type: nacos nacos: namespace: 6c3b0720-5a38-4e78-ac5a-56d70128ec1e username: nacos password: nacos # 配置 config: type: nacos nacos: namespace: 6c3b0720-5a38-4e78-ac5a-56d70128ec1e username: nacos password: nacos
重启测试
事务开启失败报错解决方案:
2023-05-06 00:01:05.441 WARN 27568 --- [io-8301-exec-10] i.s.tm.api.DefaultFailureHandlerImpl : Failed to begin transaction. io.seata.core.exception.TmTransactionException: TransactionException[begin global request failed. xid=null, msg=Data truncation: Data too long for column 'transaction_service_group' at row 1]
(36条消息) 分布式事务(Seata)TmTransactionException 问题_ybb_ymm的博客-CSDN博客
这个问题很明显提示的是Data too long ,说明使我们的数据在入库操作的时候报错,因为数据的长度超过了数据库字段设计的的最大长度。提示字段为transaction_service_group,则我们去我们的seata数据库中的三张表中查看此字段所在表global_table,将表中transaction_service_group字段原有32的长度更改作为256长度。