springboot整合seata

一、准备

docker部署seata-server 1.5.2参考:docker安装各个组件的命令

二、springboot集成seata

2.1 引入依赖

xml 复制代码
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
        </dependency>

2.2 bootstrap.yml配置seata

yml 复制代码
seata:
  enabled: true
  registry:
    # 配置seata的注册中心, 告诉seata client 怎么去访问seata server(TC)
    type: nacos
    nacos:
      server-addr: 192.168.200.131:8848  # seata server 所在的nacos服务地址
      application: seata-server    # seata server 的服务名seata-server ,如果没有修改可以不配
      username: nacos
      password: nacos
      group: SEATA_GROUP          # seata server 所在的组,默认就是SEATA_GROUP,没有改也可以不配
  config:
    type: nacos
    nacos:
      server-addr: 192.168.200.131:8848
      username: nacos
      password: nacos
      group: SEATA_GROUP
  tx-service-group: default-tx-group  #这里每个服务都是对应不同的映射名,在配置中心可以看到
  service:
    vgroup-mapping:
      default-tx-group: default

2.3 在nacos的对应分组新增配置文件

这一步必须有,否则会报错找不到service.vgroupMapping.xxxxxxxx

bash 复制代码
can not get cluster name in registry config 'service.vgroupMapping.default_tx_group', please make sure registry config correct


2.4 切换druid数据源

yml 复制代码
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.168.200.131:3306/sd?serverTimezone=GMT%2B8
    username: root
    password: root
    druid:
      initialSize: 5
      minIdle: 5
      maxActive: 20
      maxWait: 600000

2.5 在业务库中创建undo_log表

sql 复制代码
CREATE TABLE `undo_log` (
  `branch_id` bigint(20) NOT NULL COMMENT 'branch transaction id',
  `xid` varchar(100) NOT NULL COMMENT 'global transaction id',
  `context` varchar(128) NOT NULL COMMENT 'undo_log context,such as serialization',
  `rollback_info` longblob NOT NULL COMMENT 'rollback info',
  `log_status` int(11) NOT NULL COMMENT '0:normal status,1:defense status',
  `log_created` datetime(6) NOT NULL COMMENT 'create datetime',
  `log_modified` datetime(6) NOT NULL COMMENT 'modify datetime',
  UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AT transaction mode undo table';

三、具体步骤

  1. 给order-service和product-service的父工程sd-service引入依赖spring-cloud-starter-alibaba-seata
  2. 给order-service和product-service的bootstrap.yml加入2.2和2.4的配置
  3. 在nacos中进行2.3的配置
  4. 在order-service中测试,代码如下(上面是order-service,下面是product-service,通过feign进行远程调用)

error:

  • 在两个微服务中手动回滚GlobalTransactionContext.reload(RootContext.getXID()).rollback()会生效;
  • 使用@GlobalTransactional注解时,在order-service中抛出异常回滚会生效;但是在product-service中抛出异常时,事务已执行的操作都会提交,不会回滚,不知道为什么(找到问题了,feign客户端的fallback降级会用aop拦截异常,因此seata的aop识别不到下游服务异常,所以需要把所有fallback关掉测试)

成功!!!

相关推荐
Wang's Blog6 小时前
Java 项目实战: 外卖平台优化-Nginx配置文件结构与块层级
java·开发语言·nginx
卷无止境8 小时前
独立开发者的"富矿地带":哪些垂直领域值得你押注一辈子?
后端·python
\光辉岁月/8 小时前
5.java-数组
java·开发语言
谢亮_vipxieliang8 小时前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
狼爷8 小时前
从零用 Java 构建 AI Agent 框架:JavaManus 设计与实现深度解析
后端·langchain·aigc
郑州光合科技余经理8 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
2601_962071578 小时前
类变量和全局变量的生命周期有什么区别?
java·开发语言·jvm
code2cat8 小时前
Java进阶篇之AtomicReference:一次替换引用,读到一份完整状态
java·并发编程·不可变对象·atomicreference
专业程序开发源9 小时前
springboot简历管理系统81389-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计
Wang's Blog9 小时前
Java 项目实战: 外卖平台优化-前后端分离开发模式与工程拆分
java·开发语言