mybatis-plus之数据源切换事务失效问题
为什么存在数据源切换和食物时效问题?
由于业务数据来源不同 需要配置多个数据源来进行数据的查询 编辑等操作 这一切换业务对数据的一致性要求很高那就要保证ACID啦 也就是数据的有效性 要么是成功的 要么是失败的。
数据源切换采用mybatisplus支持
多数据源配置:oracle和mysql的数据类型
spring:datasource:dynamic:primary: master #设置默认的数据源或者数据源组,默认值即为masterdatasource:master:username: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://10.20.204.130:3306/user?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghaicoloan:username: rootpassword: rootdriver-class-name: oracle.jdbc.driver.OracleDriverurl: jdbc:oracle:thin:@10.20.201.173:1521:rthhhhhdb
由于是公司业务 故大致做一些特殊类名称的改改写
1:方法的入口
@RestController
public class testContorller {@AutowiredtestService testService;@PostMapping("/queryBankInfoList")public String queryBankInfoList(){List<CoTodoTask> coTodoTasks = testService.queryBankInfoList();return JSON.toJSONString(JSON.toJSONString(coTodoTasks));}
}
service接口定义
public interface testService extends IService<CoTodoTask> {List<Task> queryBankInfoList();}
实现service的核心类
Service
@DS("coloan")
public class testServiceImpl extends ServiceImpl<TaskMapper, Task> implements testService {@AutowiredUserService userService;@AutowiredTaskMapper TaskMapper;@Transactional(rollbackFor = Exception.class)@Overridepublic List<Task> queryBankInfoList() {// 用户表在MySQLResult result = userService.userInfo(117);QueryWrapper<Task> wrapper = new QueryWrapper<>();wrapper.isNotNull("id");// 任务表在Oracle中List<Task> Tasks = TaskMapper.selectList(wrapper);return Tasks;}
}
默认主数据原 这里可以不用注解指定 因为配置文件默认的主数据原就是master 这里我加上了
@Service
@DS("master")
public class UserServiceImpl implements UserService {@Overridepublic Result userInfo(Integer userId) {User user = userMapper.selectUser(userId, null);return new Result().setData(userVO);}
}
运行调试 发现一下问题
Error querying database. Cause: java.sql.SQLSyntaxErrorException: ORA-00942: 表或视图不存在
注意观察信息
userService的数据库应该是master,但是却是coloan的,导致代码报500,也就是说@DS切换数据源没有起作用
初步结论
多数据源失效,然后去掉事务发现切换正常 在于这样的切换失去了事务控制的行为。
通过下面的方式解决
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)@Overridepublic List<CoTodoTask> queryBankInfoList() {...}
通过上述的修改 数据源能正常的切换 并且可控事务
2:什么是事务的传播特性
当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。
事务的传播行为可以由传播属性指定。Spring定义了7种类传播行为。

演示事务的传播特性
ps:这里借用一下我之前看到的一篇关于事务传播特性特别棒的几张图片。
1:大小事务传播特性都是REQUIRED
@Transactional(propagation = Propagation.REQUIRED)public void multiTransaction() {}@Transactional(propagation = Propagation.REQUIRED)public void updateBook() {}@Transactional(propagation=Propagation.REQUIRED)public void updateUser() {}
传播流程:

大小事务传播特性都是REQUIRES_NEW

传播流程:
3:大事务是REQUIRED,小1REQUIRED,小2REQUIRES_NEW

传播流程:

总结:
事务会导致多数据源失效,这个大家一定要记清
一定要明白事务的传播特性,开发中其实常用的就只有REQUIRED和REQUIRES_NEW,大家只要把这两个搞明白,就能应对绝大数的问题。
以上是mybatis-plus之数据源切换事务失效问题 关注老哥带你上高速 。。。。。。。。。

相关文章:
mybatis-plus之数据源切换事务失效问题
为什么存在数据源切换和食物时效问题? 由于业务数据来源不同 需要配置多个数据源来进行数据的查询 编辑等操作 这一切换业务对数据的一致性要求很高那就要保证ACID啦 也就是数据的有效性 要么是成功的 要么是失败的。 数据源切换采用mybatisplus支持 多数据源配置&a…...
vue 百度地图点击marker修改marker图片,其他marker图片不变。
解决思路,就是直接替换对应marker的图片。获取marker对象判断点击的marker替换成新图片,上一个被点击的就替换成老图片。 marker.name tag;marker.id i; //一定要设置id,我这里是设置的循环key值,要唯一性。map.addOverlay(mark…...
【Javaer学习Python】 1、Django安装
安装 Python 和 PyCharm 的方法就略过了,附一个有效激活PyCharm的链接:https://www.quanxiaoha.com/pycharm-pojie/pycharm-pojie-20241.html 1、安装Django # 安装Django pip install Django# 查看当前版本 python -m django --version 5.0.62、创建项…...
SSL协议
SSL 安全传输协议(安全套接层) 也叫TLS ---- 传输层安全协议 SSL的工作原理:SSL协议因为是基于TCP协议工作的,通信双方需要先建立TCP会话。因为SSL协议需要进行安全保证,需要协商安全参数,所以也需要建立…...
什么情况下会造成索引失效?
2.3.4. 索引失效 对索引使用左或者左右模糊匹配 使用左或者左右模糊匹配的时候,也就是 like %xx 或者 like %xx% 这两种方式都会造成索引失效。但是如果前缀是确定的那么就可以使用到索引,例如 name like 许%。 因为索引 B 树是按照「索引值」有序排列…...
间隔采样视频的代码
项目统计模型准确率 项目会保存大量视频,为了统计模型的精度,我们想要十五分钟抽取一个视频用来统计。 import os import shutil from datetime import datetime, timedelta #抽取视频的代码,会在每个小时的0分、15分、30分、45分取一个命名…...
C++ QT设计模式 (第二版)
第3章 Qt简介 3.2 Qt核心模块 Qt是一个大库,由数个较小的库或者模块组成,最为常见的如下:core、gui、xml、sql、phonon、webkit,除了core和gui,这些模块都需要在qmake的工程文件中启用 QTextStream 流,Qdat…...
【经验总结】超算互联网服务器 transformers 加载本地模型
1. 背景 使用 超算互联网 的云服务,不能连接外网,只能把模型下载到本地,再上传上去到云服务。 2. 模型下载 在 模型中 https://huggingface.co/models 找到所需的模型后 点击下载 config.json pytorch_model.bin vocab.txt 3. 上传模型文…...
ubuntu编译pcl时报错
报错如下 cc1plus: warning: -Wabi wont warn about anything [-Wabi] cc1plus: note: -Wabi warns about differences from the most up-to-date ABI, which is also used by default cc1plus: note: use e.g. -Wabi11 to warn about changes from GCC 7 在网上找到了一封邮件…...
Rust中的单元测试
概述 Rust内置了单元测试的支持,这点和Golang一样,非常的棒,我超级喜欢单元测试!!! 本节课的代码还是基于之前的求公约数的案例。 之前的完整代码如下: fn gcd(mut n: u64, mut m: u64) ->…...
ubuntu18.04系统安装pangolin
1. 安装pangolin依赖项 ctrlaltt 打开终端,依次输入下面的命令 sudo apt update sudo apt upgrade sudo apt install libglew-dev cmake libboost-dev libboost-thread-dev libboost-filesystem-dev libeigen3-dev -y 2.在终端中输入下面的命令,克隆…...
洛谷P10397题解
题目描述 给定一条 std::freopen 语句,输出其操作的文件名称。 形式化地,std::freopen 语句都应该恰好是 std::freopen("<title>","<mode>",<stream>);其中 <title> 为其操作的文件名称。其至少包含一个…...
【Linux】自动化编译工具——make/makefile(超细图例详解!!)
目录 一、前言 二、make / Makefile背景介绍 🥝Makefile是干什么的? 🍇make又是什么? 三、demo实现【见见猪跑🐖】 四、依赖关系与依赖方法 1、概念理清 2、感性理解【父与子👨】 3、深层理解【程序…...
goroutine调度策略
Golang的调度器采用M:N调度模型,其中M代表用户级别的线程(也就是goroutine),而N代表的事内核级别的线程。Go调度器的主要任务就是N个OS线程上调度M个goroutine。这种模型允许在少量的OS线程上运行大量的goroutine。 Go调度器使用了三种队列来管理gorout…...
TypeScript中`unknown`的使用场景:安全处理未知类型
TypeScript中unknown的使用场景:安全处理未知类型 引言 在TypeScript中,unknown类型是除了any类型之外的另一种选择,它用于表示一个值可能是任何类型。与any不同,unknown提供了一种更安全的方式来处理未知的数据,因为…...
react18【系列实用教程】JSX (2024最新版)
为什么要用 JSX? JSX 给 HTML 赋予了 JS 的编程能力 JSX 的本质 JSX 是 JavaScript 的语法扩展,浏览器本身不能识别,需要通过解析工具(如babel)解析之后才能在浏览器中运行。 bable 官网可以查看解析过程 JSX 的语法 …...
Docker 创建网络
问题: 1.需要将多个容器添加到同一个网络. 2.docker-compose.yaml 如果不指定,默认会重新创建一个网卡. 创建网卡 docker network create -d bridge mynet ##-d 指定模式(默认桥接)查看自定义网络信息 docker inspect mynet…...
ASME美国机械工程师学会文献如何查询下载经验分享
一、ASME美国机械工程师学会数据库简介: ASME是世界上最大的技术出版机构之一,制定众多的工业和制造业行业标准。现在ASME拥有工业和制造行业的600项标准和规范,这些标准在全球90多个国家被采用。 ASME数据库包含25种专业期刊,其…...
Spring MVC分页示例
Spring MVC分页示例 分页用于在不同部分显示大量记录。在这种情况下,我们将在一页中显示10、20或50条记录。对于其余记录,我们提供链接。 我们可以在Spring MVC中简单地创建分页示例。在此分页示例中,我们使用MySQL数据库来获取记录。 创建…...
C++基础——继承(上)
一、继承的概念 继承 (inheritance) 机制是面向对象程序设计使代码可以复用的最重要的手段,它允许实现者保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称之为派生类; 继承呈现了面向对象程序设计的层次结构…...
终极网盘下载加速工具:告别限速,享受高速下载自由
终极网盘下载加速工具:告别限速,享受高速下载自由 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘…...
罗技鼠标宏:绝地求生后坐力控制全攻略
罗技鼠标宏:绝地求生后坐力控制全攻略 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 想要在《绝地求生》中实现精准压枪,…...
5分钟极速上手:B站视频转文字工具bili2text完整指南
5分钟极速上手:B站视频转文字工具bili2text完整指南 【免费下载链接】bili2text Bilibili视频转文字,一步到位,输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 还在为整理B站视频内容而烦恼吗?每…...
Leetcode 思路-105.从前序与中序序列构造二叉树
105.从前序与中序序列构造二叉树给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。1.简单思路根据先序遍历根节点在前的特点,取到根节点后&a…...
百度网盘直链解析工具:三步实现全速下载的终极方案
百度网盘直链解析工具:三步实现全速下载的终极方案 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 百度网盘作为国内主流云存储平台,其下载限速问题一直…...
告别配置烦恼:一键脚本+环境变量,让你的Mac上Gradle(Homebrew版)和IDEA无缝协作
告别配置烦恼:一键脚本环境变量,让你的Mac上Gradle(Homebrew版)和IDEA无缝协作 作为一名长期在Mac上使用Gradle的开发者,你是否经历过这样的困扰:每次换新机器或升级Gradle版本后,都要手动查找libexec路径,…...
【实操经验】拒答能力不达标,大模型备案怎么过
在生成式 AI 监管趋严的 2026 年,拒答率≥95% 是大模型备案的硬性门槛(GB/T 45644-2025)。不少自研或二次开发模型因安全对齐不足、拒答逻辑薄弱,测试时频繁 “翻车”—— 敏感问题答非所问、违法指令直接执行、多轮诱导轻易妥协&…...
graph-autofusion:CANN 的自动算子融合引擎
GE 的图优化 pass 里,算子融合是对推理性能影响最大的一个。但 GE 的融合规则是硬编码的——ConvBNReLU 写一条规则,BMMSoftmaxBMM 写一条规则。规则多了维护成本直线上升,总有覆盖不到的融合场景。 graph-autofusion 解决了这个问题。它是一…...
终极指南:3分钟掌握TMSpeech,打造完全本地的实时语音转文字神器
终极指南:3分钟掌握TMSpeech,打造完全本地的实时语音转文字神器 【免费下载链接】TMSpeech 腾讯会议摸鱼工具 项目地址: https://gitcode.com/gh_mirrors/tm/TMSpeech 你是否厌倦了云端语音识别服务的隐私担忧和网络延迟?想要一个真正…...
【2025 版】CMD 命令大全|超详细!零基础到精通,一篇封神✅
在Windows操作系统中,命令提示符(CMD)是一个强大的工具,允许用户通过输入命令来执行各种操作。无论是系统管理、网络配置,还是文件管理,CMD都能提供高效的解决方案。 一、基本命令 cd:更改目录…...
