mybatis-plus之数据源切换事务失效问题

为什么存在数据源切换和食物时效问题?
由于业务数据来源不同 需要配置多个数据源来进行数据的查询 编辑等操作 这一切换业务对数据的一致性要求很高那就要保证ACID啦 也就是数据的有效性 要么是成功的 要么是失败的。
数据源切换采用mybatisplus支持
多数据源配置:oracle和mysql的数据类型

 spring:
  datasource:
    dynamic:
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      datasource:
        master:
          username: root
          password: root
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://10.20.204.130:3306/user?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
        coloan:
          username: root
          password: root
          driver-class-name: oracle.jdbc.driver.OracleDriver
          url: jdbc:oracle:thin:@10.20.201.173:1521:rthhhhhdb

由于是公司业务 故大致做一些特殊类名称的改改写
1:方法的入口

@RestController
public class testContorller {

    @Autowired
    testService 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 {

    @Autowired
    UserService userService;

    @Autowired
    TaskMapper TaskMapper;

    @Transactional(rollbackFor = Exception.class)
    @Override
    public List<Task> queryBankInfoList() {

        //  用户表在MySQL
        Result 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 {

    @Override
    public 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)
    @Override
    public 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之数据源切换事务失效问题 关注老哥带你上高速 。。。。。。。。。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/626577.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux下VMamba 环境复现+环境测试

# 1. 创建自己的虚拟环境 conda create -n VMamba python3.10.13 conda activate VMamba # 2. cuda-11.8 conda install cudatoolkit11.8 -c nvidia # 3. torch torchvision torchaudio 与 官网命令一致 pip install torch2.1.1 torchvision0.16.1 torchaudio2.1.1 --index-url…

自集成式 HTTP 代理方案

前言 大部分程序员&#xff0c;想必都会有一个常用的抓包代理工具&#xff1b; 但在座的各位&#xff0c;可曾见过这样一款集成在 Web 应用中的代理工具&#xff1f; ​&#xff0c;时长00:45 它是明显区别于传统代理工具的&#xff0c;有以下特性&#xff1a; 零安装、零配…

解决AdaptiveAvgPool2d部署算子不支持问题

一、Pytorch中AdaptiveAvgPool2d函数详解 torch.nn.AdaptiveAvgPool2d()接受两个参数&#xff0c;分别为输出特征图的长和宽&#xff0c;其通道数前后不发生变化。如以下&#xff1a; self.global_avgpool nn.AdaptiveAvgPool2d(1) # 输出N*C*1*1 self.global_avgpool …

AcWing166. 数独-DFS剪枝与优化

题目 思路 思考问题&#xff1a;搜索顺序->考虑剪枝搜索顺序&#xff1a;先随意选择一个空格子&#xff0c;枚举该格子可填写的数字&#xff0c;当所有格子都填完的时候&#xff0c;说明可以退出了剪枝&#xff1a; 优化搜索顺序&#xff1a;随意选择一个空格子&#xff1a…

【讲解下iCloud如何高效利用】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

C++实战演练---负载均衡在线oj项目 || 编译服务模块设计

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 前言 上一篇预热文章简单说过我们的编写思路&#xff0c;首先要实现的是编译功能&#xff0c;那么在编译功能版块中&…

Java面试八股之float和double的区别

Java中float和double的区别 存储空间与精度&#xff1a; double&#xff1a;占据64位&#xff08;8字节&#xff09;存储空间&#xff0c;属于双精度浮点数。它可以提供较高的精度&#xff0c;通常能够精确表示大约15到17位十进制数字&#xff0c;适合用于需要较高精度计算或…

SSM【Spring SpringMVC Mybatis】—— Spring(二)

如果对于Spring的一些基础理论感兴趣可见&#x1f447; SSM【Spring SpringMVC Mybatis】—— Spring&#xff08;一&#xff09; 目录 1、Spring中bean的作用域 1.1 语法 1.2 四个作用域 2、Spring中bean的生命周期 2.1 bean的生命周期 2.2 bean的后置处理器 2.3 添加后…

upload-labs靶场通关详解(1-15)

1.pass-01 查看源代码 是js&#xff0c;属于前端校验 可以通过禁用js来上传文件 2.pass-02 根据提示是MIME绕过 MIME&#xff1a;是设定某种扩展名的文件 用一种应用程序来打开的方式类型&#xff0c;当该扩展名文件被访问的时候&#xff0c;浏览器会自动使用指定应用程序来…

OpenAI发布新品GPT-4o,电影《HER》演绎的世界真的来了!

5月14日&#xff0c;OpenAI宣布推出最新旗舰生成式AI模型GPT-4o&#xff0c;它可以实时处理音频、视觉、并对文本进行推理。可以说这是一种全新的交互模式&#xff0c;它完美复刻电影《Her》的世界&#xff0c;标志着人工智能全感知时代的到来。 GpuMall智算云 | 省钱、好用、…

swiper 点击事件失效问题

在刚开始使用是 swiper 时&#xff0c;点击事件有时失效&#xff0c;这些个问题的原因是&#xff1a;swiper设置looptrue时&#xff0c;会生成虚拟slide进行填充&#xff0c;对这些虚拟slide元素进行操作是无效的。 简单粗暴的方法就是将 loop 置为 false ....................…

JVM面试题:85道JVM虚拟机面试题及答案

面试题 1 .简述Java堆的结构&#xff1f;什么是堆中的永久代(Perm Gen space)? JVM整体结构及内存模型 试题回答参考思路&#xff1a; 1、堆结构 JVM的堆是运行时数据区&#xff0c;所有类的实例和数组都是在堆上分配内存。它在JVM启动的时候被创建。对象所占的堆内存是由自…

开发测试必须知道的 10种 常见软件架构模式

你是否想知道企业大规模系统是如何设计的? 在软件开发开始之前&#xff0c;我们必须选择一个合适的架构&#xff0c;能提供所需的功能和质量特性。因此&#xff0c;在将架构应用到我们的设计之前&#xff0c;我们应该了解各种不同架构的特点。 01 什么是架构模式 根据维基百…

一文分享:抖音外卖城市合伙人如何申请合作?

在当今数字化时代&#xff0c;外卖和团购业务蓬勃发展&#xff0c;商家们纷纷寻求在多个平台上拓宽销售渠道&#xff0c;以获取更多的订单和利润&#xff0c;这也给创业者提供创来机会。在这其中&#xff0c;抖音外卖作为一股新势力&#xff0c;自然吸引了众多创业者的目光&…

解锁客户需求密码:银行业数据分析在业务决策中的关键作用

一、引言 在数字化和大数据时代的浪潮下&#xff0c;银行业正经历着前所未有的变革。作为数据分析领域的资深专家&#xff0c;我深知数据分析在银行业务发展中的重要性和价值。本文将从银行业数据分析的角度出发&#xff0c;深入探讨相关业务场景下的数据分析应用&#xff0c;…

斥巨资!韩国力撑芯片产业

KlipC报道&#xff1a;韩国为加强本国半导体产业竞争力&#xff0c;将推进一项超过10万亿韩元的支持计划。 大型科技公司微软、亚马逊和谷歌为了保持自己大型语言模型的竞争力&#xff0c;投入了大量的资金&#xff0c;全球对可生成AI应用的需求在不断增长&#xff0c;市场上对…

Vision Mamba 代码调试---Pycharm+AutoDL

《AutoDL使用手册》 1. 服务器租用与配置 先上项目链接&#xff1a; GitHub - hustvl/Vim: Vision Mamba: Efficient Visual Representation Learning with Bidirectional State Space Model 1.1 服务器租用与配置 根据环境要求&#xff0c;去租一个服务器&#xff1a;AutoDL算…

Ajax 学习

文章目录 1. 前置知识1.1 ajax 介绍1.2 XML 简介 2. AJAX 学习2.1 AJAX基础学习&#xff08;1&#xff09;AJAX的特点&#xff08;2&#xff09;AJAX 初体验&#xff08;3&#xff09;服务端响应json 数据 2.2 IE 缓存问题2.3 请求超时和网络异常2.4 手动取消请求2.5 重复请求2…

鸿蒙 DevEcoStudio:用户名密码获取保存

【使用首选项实现用户名密码保存获取】 打开src/main/ets/entryability路径下的EntryAbility.ts文件 在 export default class EntryAbility extends UIAbility {onCreate(want, launchParam) {hilog.info(0x0000, testTag, %{public}s, Ability onCreate);下边添加内容&…

【JVM】调优工具

这里简单介绍一下各种调优用到的工具 一&#xff0c;环境准备 首先我们需要准备好Java环境&#xff0c;和win上的jdk环境&#xff08;图形化界面如jconsole只有jdk中有&#xff09;。 有这样一个类Prolem&#xff0c;每个线程都会带来100个垃圾对象&#xff0c;线程new完100…