当前位置: 首页 > news >正文

mybatisPlus一个事务中切换数据源概述

概述

在多数据源的配置下,业务中经常遇到在一个被本地事务包裹的save/edi方法中需要查询另一个数据源的数据;
直接查询会提示table不存在,这是因为一个事务和一个mysql连接是绑定的,mysql的连接背后包含了数据库信息,直接调用还是在当前连接上调用的;

这里可以利用事务的单一connection连接这个特性,曲线解决这个问题;

环境
mysql8
springboot2.7.4

方法

方法很简单,就是在查询另一个数据源时,开启一个新事务就行了


public class LogicDeleteTest {@Transactionalpublic void asLinkDiscountServiceLogicDelete(){//获取aop代理类((LogicDeleteTest)AopContext.currentProxy()).findDataFromOtherDataSource();}@Transactional(propagation = Propagation.REQUIRES_NEW)public Object findDataFromOtherDataSource(){return null;}}

源码分析

spring的事务整体流程大致如下;
可以实际debug一波看下多数据源下,使用上述2个事务后spring对事务的执行流程;

  1. 获取事务的属性(@Transactional注解中的配置)
  2. 加载配置中的TransactionManager.
  3. 获取收集事务信息TransactionInfo
  4. 执行目标方法
  5. 出现异常,尝试处理。
  6. 清理事务相关信息
  7. 提交事务

简单起见可以从这个源码class方法中入手
org.springframework.transaction.interceptor.TransactionAspectSupport#invokeWithinTransaction

最后在这个方法中开启了新事务,并获取了一个新连接
org.springframework.jdbc.datasource.DataSourceTransactionManager#doBegin

再往下就是根据注解上的数据源name获取对应的数据源,获取到对应数据源后,之后的流程就和普通查询流程一样了
com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder#peek
com.baomidou.dynamic.datasource.DynamicRoutingDataSource#getDataSource

在这里插入图片描述

在这里插入图片描述

http://www.lryc.cn/news/345849.html

相关文章:

  • 如何在Android手机上恢复已删除的视频?
  • 【项目实战】使用Github pages、Hexo如何10分钟内快速生成个人博客网站
  • 大数据中服役新数据节点和退役旧节点步骤(hive,hadoop)
  • 数论:不定方程的引入
  • 数据中心法
  • pdffactory pro8.0虚拟打印机(附注册码)
  • 处理用户输入
  • 在装有centOS7的虚拟机上进行MySQL的安装部署
  • 【vivado】debug相关时钟及其约束关系
  • 什么是HTTP/2?
  • 【ChatGPT with Date】使用 ChatGPT 时显示消息时间的插件
  • STM:TIM定时器——定时中断
  • jetson tx2 nx实现在ros1中yolov5实现
  • 【SpringBoot笔记43】SpringBoot应用程序集成spring-boot-admin监控工具
  • 与队列和栈相关的【OJ题】
  • Unity编辑器扩展
  • 【kettle】kettle访问数据库系列文章及视频地址(更新中)
  • 共赴科技盛会“2024南京智博会”11月在南京国际博览中心召开
  • 刷代码随想录有感(62):修建二叉搜索树
  • AVL树的旋转
  • C++(动态规划之拆分整数)
  • unix C之环境变量
  • Flutter实战记录-协作开发遇到的问题
  • Linux 安装JDK和Idea
  • c#绘制渐变色的Led
  • LifeCycle之ProcessLifeCycleOwner
  • C++ | Leetcode C++题解之第79题单词搜索
  • 如何通过PHP语言实现远程控制空调
  • 【AI+换脸换装】从OpenAI 探索色情露骨内容领域浅聊AI换脸换装
  • Flutter笔记:Widgets Easier组件库(13)- 使用底部弹窗