SpringBoot集成Seata分布式事务OpenFeign远程调用
Docker Desktop 安装Seata Server
seata 本质上是一个服务,用docker安装更方便,配置默认:file
docker run -d --name seata-server -p 8091:8091 -p 7091:7091 seataio/seata-server:2.0.0
与SpringBoot集成
表结构

项目目录

dynamic和dynamic2新建user、undo_log表
每个数据库都必须包含undo_log表(user表不是必须的,这里只是演示)
CREATE TABLE `undo_log` (`branch_id` bigint NOT NULL COMMENT 'branch transaction id',`xid` varchar(128) 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 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`),KEY `ix_log_created` (`log_created`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='AT transaction mode undo table';
spring-boot-feign-seata1
pom.xml
<!-- lombok 1.18.26 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope><optional>true</optional></dependency><!-- jdbc --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- mysql 8.0.32 --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>${mysql.version}</version><scope>runtime</scope></dependency><!-- jdbc --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- web 2.7.9 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- MyBatis-Plus 3.5.2 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId></dependency><!-- seata 调用方用 openfeign 必须引入spring-cloud-starter-alibaba-seata,否则被调用方获取到的xid可能会为null --><dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId></dependency><!-- cloud seata 2.0.0 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId><exclusions><exclusion><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId></exclusion></exclusions></dependency><!-- openfeign 3.1.9 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
application.yml
server:port: 8088spring:application:name: spring-boot-feign-seata1datasource:driver-class-name: com.mysql.cj.jdbc.Driver# 数据库必须包含 undo_log 表,如果没有则用 resources 目录下的undo_log.sql 创建url: jdbc:mysql://127.0.0.1:3306/dynamic?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456seata:tx-service-group: my_test_tx_group
SpringBootFeignSeata1Application.java
@MapperScan
@EnableFeignClients
// seata 版本兼容性问题,如果启动报错就要排除 SeataRestTemplateAutoConfiguration 自动配置
@SpringBootApplication(exclude = SeataRestTemplateAutoConfiguration.class)
public class SpringBootFeignSeata1Application {public static void main(String[] args) {SpringApplication.run(SpringBootFeignSeata1Application.class, args);}}
User.java
@Data
@TableName("user")
public class User {@TableId(type = IdType.AUTO)private Integer id;private String name;
}
UserMapper.java
public interface UserMapper extends BaseMapper<User> {}
UserController.java
@RestController
@RequiredArgsConstructor
public class UserController {private final UserService userService;@GetMapping("user")public String user(@RequestParam(name = "rollback") boolean rollback) {User user = new User();user.setName("Meta");try {userService.insert(rollback, user);} catch (Exception e) {return "rollback";}return "success";}}
UserFeignClient.java(openfeign调用spring-boot-feign-seata2)
@FeignClient(name = "spring-boot-feign-seata2", url = "127.0.0.1:8089")
public interface UserFeignClient {@GetMapping("user")void user();}
UserService.java(主要的)
@Slf4j
@Service
@RequiredArgsConstructor
public class UserService {private final UserMapper userMapper;private final UserFeignClient userFeignClient;/*** 全局事务* 1、pom.xml引入seata-spring-boot-starter* 2、pom.xml引入spring-cloud-starter-alibaba-seata(排除:seata-spring-boot-starter,因为前面已经引入了。)* 3、使用 @GlobalTransactional 全局事务注解开启全局事务控制(默认:Seata AT 模式)* 4、被调用方业务层需要引入 @Transactional 本地事务注解*/@GlobalTransactional(rollbackFor = Exception.class)public void insert(boolean rollback, User user) {log.info("seata1 xid = {}", RootContext.getXID());userMapper.insert(user);userFeignClient.user();if (rollback) {throw new RuntimeException("rollback");}}
}
spring-boot-feign-seata2
pom.xml和spring-boot-feign-seata是一样的
application.yml
server:port: 8089spring:application:name: spring-boot-feign-seata2datasource:driver-class-name: com.mysql.cj.jdbc.Driver# 数据库必须包含 undo_log 表,如果没有则用 resources 目录下的undo_log.sql 创建url: jdbc:mysql://127.0.0.1:3306/dynamic2?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456seata:tx-service-group: my_test_tx_group
SpringBootFeignSeata2Application.java
@MapperScan
// 被调用端引用 seata 默认 AT 模式
@EnableAutoDataSourceProxy
// seata 版本兼容性问题,如果启动报错就要排除 SeataRestTemplateAutoConfiguration 自动配置
@SpringBootApplication(exclude = SeataRestTemplateAutoConfiguration.class)
public class SpringBootFeignSeata2Application {public static void main(String[] args) {SpringApplication.run(SpringBootFeignSeata2Application.class, args);}}
UserController.java
@RestController
@RequiredArgsConstructor
public class UserController {private final UserService userService;@GetMapping("user")public void user() {User user = new User();user.setName("Meta2");userService.insert(user);}}
UserService.java
@Slf4j
@Service
@RequiredArgsConstructor
public class UserService {private final UserMapper userMapper;/*** 调用方用 openfeign 必须引入spring-cloud-starter-alibaba-seata,否则被调用方获取到的xid可能会为null* PS:被调用方可以不用引入*/@Transactional(rollbackFor = Exception.class)public void insert(User user) {log.info("seata2 xid = {}", RootContext.getXID());userMapper.insert(user);}}
上面重复的文件就不说了
启动两个项目
访问localhost:8088/user?rollback=true
返回rollback,2个数据库都没有新增数据库,验证分布式(AT)事务回滚成功
访问localhost:8088/user?rollback=false
返回success,2个数据库都新增了数据,验证分布式(AT)事务成功
相关文章:
SpringBoot集成Seata分布式事务OpenFeign远程调用
Docker Desktop 安装Seata Server seata 本质上是一个服务,用docker安装更方便,配置默认:file docker run -d --name seata-server -p 8091:8091 -p 7091:7091 seataio/seata-server:2.0.0与SpringBoot集成 表结构 项目目录 dynamic和dyna…...
视觉检测系统,是否所有产品都可以进行视觉检测?
视觉检测系统作为一种先进的质检工具,虽然具有广泛的应用范围,但并非所有产品都适合进行视觉检测。本文将探讨视觉检测系统的适用范围及其局限性。 随着机器视觉技术的快速发展,视觉检测系统已广泛应用于各个行业,为产品质检提供…...
通过金山和微软虚拟打印机转换PDF文件,流程方法及优劣对比
文章目录 一、WPS/金山 PDF虚拟打印机1、常规流程2、PDF文件位置3、严重缺陷二、微软虚拟打印机Microsoft Print to Pdf1、安装流程2、微软虚拟打印机的优势一、WPS/金山 PDF虚拟打印机 1、常规流程 安装过WPS办公组件或金山PDF独立版的电脑,会有一个或两个WPS/金山 PDF虚拟…...
采用java+B/S开发的全套医院绩效考核系统源码springboot+mybaits 医院绩效考核系统优势
采用java开发的全套医院绩效考核系统源码springbootmybaits 医院绩效考核系统优势 医院绩效管理系统解决方案紧扣新医改形势下医院绩效管理的要求,以“工作量为基础的考核方案”为核心思想,结合患者满意度、服务质量、技术难度、工作效率、医德医风等管…...
驱动开发-用户空间和内核空间数据传输
1.用户空间-->内核空间(写) #include<linux/uaccess.h> int copy_from_user(void *to,const void __user volatile*from,unsigned long n) 函数功能:将用户空间数据拷贝到内核空间 参数: to:内核空间首地…...
【408精华知识】速看!各种排序的大总结!
文章目录 一、插入排序(一)直接插入排序(二)折半插入排序(三)希尔排序 二、交换排序(一)冒泡排序(二)快速排序 三、选择排序(一)简单选…...
【STM32 |程序实例】按键控制、光敏传感器控制蜂鸣器
目录 前言 按键控制LED 光敏传感器控制蜂鸣器 前言 上拉输入:若GPIO引脚配置为上拉输入模式,在默认情况下(GPIO引脚无输入),读取的GPIO引脚数据为1,即高电平。 下拉输入:若GPIO引脚配置为下…...
Spring boot使用websocket实现在线聊天
maven依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spr…...
品牌设计理念和logo设计方法
一 品牌设计的目的 设计是为了传播,让传播速度更快,传播效率更高,减少宣传成本 二 什么是好的品牌设计 好的设计是为了让消费者更容易看懂、记住的设计, 从而辅助传播, 即 看得懂、记得住。 1 看得懂 就是让别人看懂…...
Python | Leetcode Python题解之第88题合并两个有序数组
题目: 题解: class Solution:def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:"""Do not return anything, modify nums1 in-place instead."""p1, p2 m - 1, n - 1tail m n - 1whi…...
vscode新版本remotessh服务端报`GLIBC_2.28‘ not found解决方案
问题现象 通过vscode的remotessh插件连接老版本服务器(如RHEL7,Centos7)时,插件会报错,无法连接。 查看插件的错误日志可以看到类似如下的报错信息: dc96b837cf6bb4af9cd736aa3af08cf8279f7685/node: /li…...
盘他系列——oj!!!
1.Openjudge 网站: OpenJudge 2.洛谷 网站: 首页 - 洛谷 | 计算机科学教育新生态 3.环球OJ 网站: QOJ - QOJ.ac 4. 北京大学 OJ:Welcome To PKU JudgeOnline 5.自由OJ 网站: https://loj.ac/ 6.炼码 网站:LintCode 炼码 8.力扣 网站: 力扣 9.晴练网首页 - 晴练网...
洛谷 P2657 [SCOI2009] windy 数 题解 数位dp
[SCOI2009] windy 数 题目背景 windy 定义了一种 windy 数。 题目描述 不含前导零且相邻两个数字之差至少为 2 2 2 的正整数被称为 windy 数。windy 想知道,在 a a a 和 b b b 之间,包括 a a a 和 b b b ,总共有多少个 windy 数&…...
Python爬虫入门:网络世界的宝藏猎人
今天阿佑将带你踏上Python的肩膀,成为一名网络世界的宝藏猎人! 文章目录 1. 引言1.1 简述Python在爬虫领域的地位1.2 阐明学习网络基础对爬虫的重要性 2. 背景介绍2.1 Python语言的流行与适用场景2.2 网络通信基础概念及其在数据抓取中的角色 3. Python基…...
【NodeMCU实时天气时钟温湿度项目 6】解析天气信息JSON数据并显示在 TFT 屏幕上(心知天气版)
今天是第六专题,主要内容是:导入ArduinoJson功能库,借助该库解析从【心知天气】官网返回的JSON数据,并显示在 TFT 屏幕上。 如您需要了解其它专题的内容,请点击下面的链接。 第一专题内容,请参考&a…...
重构四要素:目的、对象、时机和方法
目录 1.引言 2.重构的目的:为什么重构(why) 3.重构的对象:到底重构什么(what) 4.重构的时机:什么时候重构(when) 5.重构的方法:应该如何重构(how) 6.思考题 1.引言 一些软件工程师对为什么要重构(why)、到底重构什么(what)、什么时候重构(when)应该如何重构(how)等问题的…...
基于Echarts的大数据可视化模板:服务器运营监控
目录 引言背景介绍研究现状与相关工作服务器运营监控技术综述服务器运营监控概述监控指标与数据采集可视化界面设计与实现数据存储与查询优化Echarts与大数据可视化Echarts库以及其在大数据可视化领域的应用优势开发过程和所选设计方案模板如何满足管理的特定需求模板功能与特性…...
Python3 笔记:Python的常量
常量(constant):跟变量相对应,指第一次赋予值后就保持固定不变的值。 Python里面没有声明常量的关键字,其他语言像C/C/Java会有const修饰符,但Python没有。 Python中没有使用语法强制定义常量,…...
【Linux】自动化构建工具make/Makefile和git介绍
🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343🔥 系列专栏:https://blog.csdn.net/qinjh_/category_12625432.html 目录 前言 Linux项目自动化构建工具-make/Makefile 举例 .PHONY 常见符号 依赖关系…...
C语言—关于字符串(编程实现部分函数功能)
0.前言 当我们使用这些函数功能时,可以直接调用头文件---#include<string.h>,然后直接使用就行了,本文只是手动编写实现函数的部分功能 1.strlen函数功能实现 功能说明:strlen(s)用来计算字符串s的长度,该函数计数不会包括最…...
突破限制的AI开发助手:Cursor Free VIP开源工具全攻略
突破限制的AI开发助手:Cursor Free VIP开源工具全攻略 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your tri…...
Granite TimeSeries FlowState R1赋能网络安全:异常流量检测与预测
Granite TimeSeries FlowState R1赋能网络安全:异常流量检测与预测 最近和几个做运维和安全的朋友聊天,大家普遍有个头疼的问题:面对海量的网络流量数据,怎么才能提前发现那些“不对劲”的苗头?等攻击真的发生了&…...
如何让你的10美元鼠标秒变Mac神器?Mac Mouse Fix终极指南
如何让你的10美元鼠标秒变Mac神器?Mac Mouse Fix终极指南 【免费下载链接】mac-mouse-fix Mac Mouse Fix - Make Your $10 Mouse Better Than an Apple Trackpad! 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix 还在为Mac上的第三方鼠标发…...
零代码文本分类:AI万能分类器WebUI,3步实现智能打标系统
零代码文本分类:AI万能分类器WebUI,3步实现智能打标系统 1. 引言:告别传统分类的繁琐流程 在信息处理领域,文本分类一直是个高频需求。无论是电商平台的商品评论分析,还是客服系统的工单归类,传统方法都需…...
【 技术方案设计】复杂分布式系统统一日志Trace平台 + 用户行为打点分析平台
前端+后端(分布式应用有 fastapi, springboot 等应用)系统,要做一个统一日志 trace 平台,并对用户行为日志做打点分析。给我一个详细的技术方案设计 + 数据存储 + 前后端 sdk + 接口 API 设计 统一日志Trace平台 + 用户行为打点分析平台 技术方案设计 文章目录 统一日志Tr…...
实测lora-scripts:训练赛博朋克LoRA全记录,效果惊艳易上手
实测lora-scripts:训练赛博朋克LoRA全记录,效果惊艳易上手 1. 为什么选择lora-scripts进行LoRA训练 在AI图像生成领域,Stable Diffusion等模型虽然强大,但往往难以精准捕捉特定艺术风格的细节特征。比如输入"赛博朋克城市夜…...
Flink架构核心与资源优化全解析,Spring Boot SSE 流式输出,智能体的实时响应。
Flink 架构组件 Flink 的核心架构由多个协同工作的组件构成,确保分布式计算的高效性与容错性。 JobManager 负责协调作业执行,包括调度任务、管理检查点(Checkpoint)和故障恢复。JobManager 包含三个子组件: ResourceM…...
中文文献管理效率提升指南:茉莉花插件的全方位应用
中文文献管理效率提升指南:茉莉花插件的全方位应用 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件,用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 在学术研究与文献管…...
ChatGLM3-6B零基础部署:Streamlit重构版5分钟快速搭建本地智能助手
ChatGLM3-6B零基础部署:Streamlit重构版5分钟快速搭建本地智能助手 1. 引言:为什么你需要一个本地专属的AI助手? 想象一下,你正在写一份重要的技术报告,需要快速查询某个编程概念;或者你在分析一份长达几…...
Audio Pixel Studio保姆级教程:Windows/Mac/Linux三平台本地部署详解
Audio Pixel Studio保姆级教程:Windows/Mac/Linux三平台本地部署详解 1. 引言:极简像素音频工作站 Audio Pixel Studio是一款基于Streamlit开发的轻量级音频处理Web应用,它将专业级音频处理能力封装在清新简约的界面中。无论你是内容创作者…...
