Java 多数据源时事务回滚问题
目录
问题描述
1、Atomikos事务管理器
2、MyBatis-Plus多数据源支持
dynamic-datasource
特性
约定
使用方法
mybatis-mate
特性
使用方法
问题描述
在多数据源的情况下,如果一个事务跨越多个数据源,当其中一个数据源的操作失败时,我们需要回滚所有已经执行的操作。然而,Java默认的事务管理机制只支持单个数据源的事务回滚,无法处理跨多个数据源的事务回滚。
1、Atomikos事务管理器
Atomikos是一个开源的事务管理器,它支持跨多个数据源的事务回滚。
下表展示了解决Java多数据源时事务回滚问题的步骤:

下面我们将逐步讲解每个步骤需要做的操作,并提供相应的代码和注释。
步骤1:配置Atomikos事务管理器
首先,我们需要在项目的依赖中添加Atomikos的相关依赖:
<dependency>
<groupId>com.atomikos</groupId>
<artifactId>transactions-jta</artifactId>
<version>4.0.6</version>
</dependency>
参考:https://blog.51cto.com/u_16213361/9268072
Spring Boot+Atomikos进行多数据源的分布式事务管理详解和实例-CSDN博客
2、MyBatis-Plus多数据源支持
单一数据源已无法满足复杂业务需求,多数据源(动态数据源)应运而生。本文将介绍两种 MyBatis-Plus 的多数据源扩展插件:开源生态的 dynamic-datasource 和 企业级生态的 mybatis-mate。
dynamic-datasource
dynamic-datasource 是一个开源的 Spring Boot 多数据源启动器,提供了丰富的功能,包括数据源分组、敏感信息加密、独立初始化表结构等。
特性
- 数据源分组:适用于多种场景,如读写分离、一主多从等。
- 敏感信息加密:使用
ENC()加密数据库配置信息。 - 独立初始化:支持每个数据库独立初始化表结构和数据库。
- 自定义注解:支持自定义注解,需继承
DS。 - 简化集成:提供对 Druid、HikariCP 等连接池的快速集成。
- 组件集成:支持 Mybatis-Plus、Quartz 等组件的集成方案。
- 动态数据源:支持项目启动后动态增加或移除数据源。
- 分布式事务:提供基于 Seata 的分布式事务方案。
约定
- 本框架专注于数据源切换,不限制具体操作。
- 配置文件中以下划线
_分割的数据源首部为组名。 - 切换数据源可以是组名或具体数据源名。
- 默认数据源名为
master,可通过spring.datasource.dynamic.primary修改。 - 方法上的注解优先于类上的注解。
使用方法
1、引入依赖:
- SpringBoot2
<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>${version}</version>
</dependency>
- SpringBoot3
<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot3-starter</artifactId><version>${version}</version>
</dependency>
2、配置数据源:
spring:datasource:dynamic:primary: masterstrict: falsedatasource:master:url: jdbc:mysql://xx.xx.xx.xx:3306/dynamicusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverslave_1:url: jdbc:mysql://xx.xx.xx.xx:3307/dynamicusername: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverslave_2:url: ENC(xxxxx)username: ENC(xxxxx)password: ENC(xxxxx)driver-class-name: com.mysql.jdbc.Driver
3、使用 @DS 切换数据源:
@Service
@DS("slave")
public class UserServiceImpl implements UserService {@Autowiredprivate JdbcTemplate jdbcTemplate;@Override@DS("slave_1")public List selectByCondition() {return jdbcTemplate.queryForList("select * from user where age >10");}
}
更多使用教程请参考Dynamic-Datasource 官网
mybatis-mate
mybatis-mate 是一个 MyBatis-Plus 的付费企业组件,内置很多好用的高级特性,其中包括多数据源扩展组件,提供了高效简单的多数据源支持。
特性
- 注解
@Sharding:支持通过注解切换数据源。 - 配置:支持灵活的数据源配置。
- 动态加载卸载:支持动态加载和卸载数据源。
- 多数据源事务:支持 JTA Atomikos 分布式事务。
使用方法
1、配置数据源:
mybatis-mate:sharding:primary: mysqldatasource:mysql:- key: node1...- key: node2cluster: slave...postgres:- key: node1...
2、使用 @Sharding 切换数据源:
@Mapper
@Sharding("mysql")
public interface UserMapper extends BaseMapper<User> {@Sharding("postgres")Long selectByUsername(String username);}
3、切换指定数据库节点:
// 切换到 mysql 从库 node2 节点
ShardingKey.change("mysqlnode2");
更多使用示例请参考
-
多数据源动态加载卸载:👉 mybatis-mate-sharding-dynamic
-
多数据源事务(jta atomikos):👉 mybatis-mate-sharding-jta-atomikos
通过上述介绍,我们可以看到 dynamic-datasource 和 mybatis-mate 都提供了强大的多数据源支持,开发者可以根据项目需求选择合适的插件来实现数据源的灵活管理。
如果框架使用的mybits-plus建议采用2
相关文章:
Java 多数据源时事务回滚问题
目录 问题描述 1、Atomikos事务管理器 2、MyBatis-Plus多数据源支持 dynamic-datasource 特性 约定 使用方法 mybatis-mate 特性 使用方法 问题描述 在多数据源的情况下,如果一个事务跨越多个数据源,当其中一个数据源的操作失败时,我…...
怎麼防止爬蟲IP被網站封鎖?
隨著越來越多的網站加強其反爬蟲措施,爬蟲IP被封鎖成為了常見的問題。如何有效地避免IP被封,從而讓數據採集工作更加順利? 常見的反爬策略包括: 頻率限制:設置請求頻率,對於發出請求過於頻繁的IP進行封鎖…...
DeepSeek + Claude 提升效果
案例1:分布式锁 问题 spring boot 和 mybatis 实现分布式锁 Deepseek R1 思考过程 嗯,用户问的是如何在Spring Boot和MyBatis中实现分布式锁。首先,我得回忆一下分布式锁的基本概念。分布式锁是为了在分布式系统中协调多个服务实例对共享…...
使用html css js 开发一个 教育机构前端静态网站模板
这个教育机构网站模板是专为前端开发初学者设计的练习项目,适合正在学习前端的学生或自学者使用。网站内容包括首页、课程体系、师资力量、关于我们和联系我们等基础页面,帮助学习者熟悉网页布局、样式设计和交互功能的实现。 静态页面 简单截图 应用…...
ranges::set_intersection set_union set_difference set_symmetric_difference
std::ranges::set_intersection:是 C20 引入的一个算法,用于计算两个已排序范围的交集。它将两个范围的交集元素复制到输出范围中。 std::ranges::set_intersection 用于计算两个已排序范围的交集。它将两个范围的交集元素复制到输出范围中。 注意事项…...
在IDEA的Maven中(同步所有Maven项目)和(重新加载所有Maven项目)的区别
特性同步所有 Maven 项目 (Sync All Maven Projects)重新加载所有 Maven 项目 (Reload All Maven Projects)主要作用使 IDEA 项目结构、依赖关系与 pom.xml 文件同步。强制重新读取所有 pom.xml 文件,并重建 IDEA 的 Maven 项目模型。缓存使用 IDEA 缓存的 Maven 项…...
如何查询网站是否被百度蜘蛛收录?
一、使用site命令查询 这是最直接的方法。在百度搜索框中输入“site:你的网站域名”,例如“site.com”(请将“example.com”替换为你实际的网站域名)。如果搜索结果显示了你的网站页面,并且显示了收录的页面数量(如“…...
el-table树状表格,默认展开第一个节点的每一层
效果如图 <template><el-table:data"tableData"style"width: 100%":tree-props"{ children: children, hasChildren: hasChildren }":expand-row-keys"expandRowKeys"row-key"id"expand-change"handleExpan…...
express-validator 数据校验详解
express-validator 是一个用于在 Express 应用中进行数据验证和清理的中间件。 一、安装 # 使用 npm 安装npm install express-validator 二、基本使用 1. 引入和初始化 const express require("express");const { body, validationResult } require("ex…...
使用VSCODE开发C语言程序
使用vscode配置C语言开发环境 一、安装VSCODE 1、下载vscode 从官方网站(https://code.visualstudio.com/Download)上,下载windows版本的vscode 2、安装vscode 下载完毕后,按照提示进行安装即可(尽可能不要安…...
Python学习心得常用的内置函数
常用的内置函数: 1.数据类型转换函数: 描述说明 描述说明 bool(obj) 获取指定对象 obj 的布尔值 str(obj) 将指定对象 obj 转成字符串类型 int(x) 将 x 转成 int 类型 float(x) 将 x 转成 float 类型 list(sequence) 将序列转成列表类型 tu…...
【数据结构初阶第十二节】设计循环队列
云边有个稻草人-CSDN博客 必须有为成功付出代价的决心,然后想办法付出这个代价。 还有最后一道关于队列的习题,这题有点难,准备好迎接挑战吧! 目录 1.【题目】 2.实现循环队列推荐用数组,Why? 3.Q1:如…...
【数据分享】1929-2024年全球站点的逐年降雪深度数据(Shp\Excel\免费获取)
气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、能见度等指标,说到气象数据,最详细的气象数据是具体到气象监测站点的数据! 有关气象指标的监测站点数据,之前我们分享过1929-2024年全球气象站…...
【强化学习的数学原理】第10课-Actor-Critic方法-笔记
学习资料:bilibili 西湖大学赵世钰老师的【强化学习的数学原理】课程。链接:强化学习的数学原理 西湖大学 赵世钰 文章目录 一、最简单的Actor-Critic(QAC)二、Advantage Actor-Critic(A2C)三、重要性采样和…...
scratch猜年龄互动小游戏 2024年12月scratch四级真题 中国电子学会 图形化编程 scratch四级真题和答案解析
scratch猜年龄互动小游戏 2024年12月电子学会图形化编程Scratch等级考试四级真题 一、题目要求 老爷爷的年龄是1-100的随机数,老爷爷询问“请猜猜我的年龄是多少?”,输入年龄,老爷爷会回答"大了"或者"小了,直到最后成功猜出年龄。 1、准备工作 (1)删…...
javaSE学习笔记23-线程(thread)-总结
创建线程的三种方式 练习代码 package com.kuang.thread;import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask;//回顾总结线程的创建 public class ThreadNew {public static void main(String[…...
Boringssl介绍
BoringSSL 是 Google 从 OpenSSL 分支出来的一个开源 TLS/SSL 库,旨在为 Google 的产品和服务提供一个更加轻量、安全和现代化的加密库。它是 OpenSSL 的一个替代品,专注于简化代码、提高安全性和减少潜在的攻击面。 以下是对 BoringSSL 的详细介绍&…...
java每日精进 2.13 MySql迁移人大金仓
1.迁移数据库 1. 数据库创建语句 MySQL: CREATE DATABASE dbname; 人大金仓(Kingbase): 在人大金仓中,CREATE DATABASE 的语法通常相同,但可能需要特别注意字符集的指定(如果涉及到多语言支持…...
2025最新智能优化算法:改进型雪雁算法(Improved Snow Geese Algorithm, ISGA)求解23个经典函数测试集,MATLAB
一、改进型雪雁算法 雪雁算法(Snow Geese Algorithm,SGA)是2024年提出的一种新型元启发式算法,其灵感来源于雪雁的迁徙行为,特别是它们在迁徙过程中形成的独特“人字形”和“直线”飞行模式。该算法通过模拟雪雁的飞行…...
C++中为什么有了tuple还需要pair?
在C中,tuple和pair都是用于存储多个值的工具。tuple可以存储任意数量的元素,而pair只能存储两个元素。既然tuple的功能更强大,为什么C标准库仍然保留了pair呢?本文将从多个角度探讨这个问题。 1. 历史兼容性 pair在C标准库中比tu…...
Open WebUI项目源码学习记录(从0开始基于纯CPU环境部署一个网页Chat服务)
感谢您点开这篇文章:D,鼠鼠我是一个代码小白,下文是学习开源项目Open WebUI过程中的一点笔记记录,希望能帮助到你~ 本人菜鸟,持续成长,能力不足有疏漏的地方欢迎一起探讨指正,比心心~…...
什么是Grok-3?技术特点,场景,潜在问题与挑战
Grok-3 的技术特点与优势 1. 超大算力与训练规模 算力投入:Grok-3 使用了 20 万块英伟达 H100 GPU,分两个阶段训练(第一阶段 10 万 GPU 训练 144 天,第二阶段 20 万 GPU 训练 92 天),总计算量是前代 Grok-2 的 10 倍。这种规模远超同期其他项目(如印度的 1.8 万 GPU 公…...
容器docker k8s相关的问题汇总及排错
1.明确问题 2.排查方向 2.1、 docker方面 docker logs -f 容器ID docker的网络配置问题。 2.2、 k8s方面 node组件问题 pod的问题(方式kubectl describe po pod的名称 -n 命名空间 && kubectl logs -f pod的名称 -n 命名空间) 调度的问题&#x…...
【Docker】百度网盘:基于VNC的Web访问及后台下载
本教程通过 Docker Compose 部署百度网盘的 VNC 版本,实现24小时不间断下载、双模式访问、数据持久化、自动重启和安全加密控制等核心功能。 目录结构规划 建议使用以下目录结构(可根据实际情况调整): ~/baidunetdisk/├── d…...
JWT 令牌
目录 一、JWT 1、什么是JWT 2、JWT的组成 3、JJWT签发与验证token 1、创建token 2、解析token 3、设置过期时间 4、自定义claims 前言: 在现代Web应用和微服务架构中,用户身份验证和信息安全传输是核心问题。JSON Web Token(J…...
鼎捷PLM深度集成DeepSeek,领跑智能研发新赛道
新年伊始,DeepSeek以其卓越的性能、高性价比和开源优势,掀起一股AI技术应用热潮,重塑各行各业的知识管理、知识应用模式。对制造业来说,首当其冲的就是研发管理变革,这也引发了企业的深度思考:在工业领域的…...
设计模式之适配模式是什么?以及在Spring AOP中的拦截器链的使用源码解析。
前言 本文涉及到适配模式的基本用法,以及在Spring AOP中如何使用,首先需要了解适配模式的工作原理,然后结合Spring AOP的具体实现来详细详细解析源码。 首先,适配模式,也就是Adapter Pattern,属于结构型设计…...
挖掘图片的秘密:如何用piexif提取和修改Exif数据
Exif(Exchangeable Image File Format)数据是一个广泛用于数字图像(尤其是JPEG和TIFF格式)中的元数据格式。它包含了关于图像的各种信息,包括拍摄设备的类型、拍摄时间、光圈、曝光时间、GPS定位信息等。Exif数据使得用…...
javaSE学习笔记22-线程(thread)-线程通信、线程池
线程通信 应用场景:生产者和消费者问题 假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中产品取走消费 如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待,…...
VMware新建虚拟机
看看自己的电脑是什么内核,有几个处理器 再分配给虚拟机 镜像文件需要自己安装下载地方https://mirrors.aliyun.com/centos/?spma2c6h.13651104.d-2001.8.3fb1320cuI1jeS 然后就出现了 然后开启虚拟机,等待 等待之后如下,选择语言 等待一段时…...
