LWM

一、Seata

一、Seata

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长度。

 

posted on 2023-04-26 20:28  Lwmm  阅读(17)  评论(0编辑  收藏  举报