Springboot 多数据源事务,切换数据源+事务

2023-05-16

项目有多个数据源, 根据配置文件配置的连接数来自动生成多数据源配置 并且使用 aop切换数据源,、使用的是 AbstractRoutingDataSource 重写 determineCurrentLookupKey 方法。

在切换数据源之前 @Transactional 先执行 ,此时会去获取数据源,而此时数据源还没有切换 就会获取默认的数据源 。 这种情况会导致数据源切换失败
源码:
在这里插入图片描述
如果不用事务,切换数据源是可以的。

2, 其它方式

@Configuration
@MapperScan(basePackages = "com.modules.**.dao",sqlSessionTemplateRef = "masterSqlSessionTemplate")
public class MasterDataSourceConfig {

    @Bean
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.master")//设置配置
    public DataSource masterDataSource() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean
    @Primary
    public SqlSessionFactory masterSqlSessionFactory() throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(masterDataSource());
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mybatis/master/**/*.xml"));
        return bean.getObject();
    }

    @Bean
    @Primary
    public DataSourceTransactionManager masterTransactionManager() {
        return new DataSourceTransactionManager(masterDataSource());
    }

    @Bean(name = "masterSqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate()
            throws Exception {
        return new SqlSessionTemplate(masterSqlSessionFactory());
    }
}

@Configuration
@MapperScan(basePackages = "com.dao",sqlSessionTemplateRef = "twoSqlSessionTemplate")
public class TwoDataSourceConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.sqlserver")//设置配置
    public DataSource twoDataSource() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean
    public SqlSessionFactory twoSqlSessionFactory() throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(twoDataSource());
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mybatis/two/**/*.xml"));
        return bean.getObject();
    }

    @Bean
    public DataSourceTransactionManager twoTransactionManager() {
        return new DataSourceTransactionManager(twoDataSource());
    }


    @Bean(name = "twoSqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate()
            throws Exception {
        return new SqlSessionTemplate(twoSqlSessionFactory());
    }
}
 **非primary的事务管理器 需要在@Transactional中加上事务管理器beanName, 不能事务不会起作用, 默认使用的是primary的事务管理器**
  @Autowired
    private MasterMapper masterMapper;

    @Autowired
    private TwoMapper twoMapper;

    @RequestMapping("/test")
    @Transactional(rollbackFor = Exception.class)
    public void report(){
        twoMapper.saveConfig(info);
        int i = 1 /0;
    }


    // 非primary的事务管理器 需要在@Transactional中加上事务管理器beanName
    @RequestMapping("/test1")
    @Transactional(rollbackFor = Exception.class,value = "twoTransactionManager")
    public void test1(){
        masterMapper.save(info);
        int i = 1 / 0;
    }

注意:此事务内只能保证同一个数据源, 非分布式事务

参考: https://blog.csdn.net/study_zmm/article/details/106790031
http://www.linhao007.com/2017/11/23/01/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Springboot 多数据源事务,切换数据源+事务 的相关文章

随机推荐

  • 从高考到程序员

    转瞬之间 xff0c 大四也已经结束了 天气晴朗 xff0c 毕业典礼上也人声鼎沸 xff0c 让我不禁想起了四年前 xff0c 高考结束大家急忙收拾东西逃离校园参加班级聚餐的情形 xff0c 与今日独自回宿舍最后清理一遍行李箱后拖着就走的
  • CAS学习笔记(三):认证中心返回多属性配置

    概述 cas server默认的可用信息只有用户名 xff0c 如果我还想知道他的角色类型等其它属性 xff0c 这时候就需要做一些配置了 其它代码编写代码方式这里不做介绍 xff0c 只做简单配置的方式介绍 配置操作 1 cas serv
  • 研究生语音识别课程作业记录(三) 非特定人孤立词识别

    研究生语音识别课程作业记录 xff08 三 xff09 非特定人孤立词识别 前言一 任务要求二 识别方法三 语音数据库四 特征参数提取五 识别过程及分析六 实验总结七 小结 前言 研究生期间的语音识别课程作业记录 xff0c 研一暑假的主要
  • 文献查找几种方法

    这几天忙着统计学院院长的一些个人研究成果 xff0c 其中要对每条研究标明相关的信息 xff0c 找到了一些途径 xff0c 可以留个备用 1 专著 1 xff09 专著估计最不好找的要算出版日期了 xff0c 所以下次要用的话 xff0c
  • Debian 11 KDE Plasma桌面环境,编译Fcitx5(只编译,不安装)

    Debian 11 KDE Plasma桌面环境 xff0c 编译Fcitx5 xff08 只编译 xff0c 不安装 xff09 安装依赖的工具和库 安装前需要检查电脑上是不是具备这些工具 xff0c 或者库 xff08 这是我根据实际情
  • 快速解决 vsftpd nologin 虚拟用户 拒绝访问 无法登录

    搭建好了vsftpd服务之后 xff0c 新建了一个nologin虚拟用户 xff0c 然而在另一台win7上用WinSCP连接ftp时提示错误 useradd d home ftp s sbin nologin ftpUser1 pass
  • 云计算的部署

    一 云计算的服务和交付模式 基础设施即服务 xff08 Iaas xff09 平台即服务 xff08 Paas xff09 软件即服务 xff08 Saas xff09 衍生出 xff1a 存储即服务 数据库即服务 安全即服务 通信即服务
  • MapReduce的数据流程、执行流程

    MapReduce的大体流程是这样的 xff0c 如图所示 xff1a 由图片可以看到mapreduce执行下来主要包含这样几个步骤 1 首先对输入数据源进行切片 2 master调度worker执行map任务 3 worker读取输入源片
  • 免费下载中国知网、万方学术论文的几种方法(福利合集)

    在国内 xff0c 中国知网收录了最多的期刊论文和硕博士论文 无论学霸学渣 xff0c 都得上去下载论文 如果你的学校在知网购买了相应的下载版权 xff0c 那恭喜你 xff0c 你通过校园网就能免费下载了 但一旦你回了家 xff0c 或学
  • 使用apt离线安装deb包

    文章目录 apt 下载的deb路径阻止apt自动删除缓存文件的方法只下载不安装的方法离线安装deb包离线安装gcc1 下载依赖2 打包下载的deb文件 xff0c 上传到没有外网连接的服务器3 安装deb包 apt 下载的deb路径 默认存
  • haar分类

    今天说一说haar分类算法 首先介绍haar like特征 haar like的特征有边缘特征 线性特征 中心特征和对角线特征 我们使用特征模板来表示特征的计算 xff0c 如图所示 xff1a 这些特征分别对应着不同的矩阵以便于进行计算
  • POI window excel 打开提示部分内容有问题, 是否尝试尽量恢复

    问题如下 window excel 打开报错如下 但是WPS打开正常 问题在于 window excel 冻结窗口只能设置一行 WPS可以设置多行 设置冻结窗口如下 冻结第一行 sheet createFreezePane 0 1 0 1
  • 解决从数据库中取出json数据有转义符

    不处理从数据库取出数据如下 String s1 61 34 34 MsgId 34 1 34 TotalCount 34 10 34 FilterCount 34 8 34 SentCount 34 7 34 ErrorCount 34 0
  • 查询数据报错 com.mysql.cj.exceptions.DataConversionException

    com mysql cj exceptions DataConversionException Caused by java sql SQLDataException Cannot determine value type from str
  • 微信调用接口报错:"errcode":45009,"errmsg":"reach max api daily quota limit hints:

    api请求次数达到最大上限 每个帐号每月共10次清零操作机会 xff0c 清零生效一次即用掉一次机会 xff08 10次包括了平台上的清零和调用接口API的清零 xff09 https developers weixin qq com do
  • @FeignClient注解 中属性 contextId使用

    64 FeignClient注解 中属性 contextId 比如我们有个user服务 xff0c 但user服务中有很多个接口 xff0c 我们不想将所有的调用接口都定义在一个类中 xff0c 比如 xff1a Client span c
  • toString和toJSONString的区别

    Map span class token generics function span class token punctuation lt span String span class token punctuation span Int
  • Neutron运营商网络和租户网络详解

    由租户创建并且管理的网络 xff0c Neutron称之为租户网络 但是Openstack不是万能的 xff0c Neutron也不是万能的 还有很多网络不在Neutron管理范围内 xff08 Neutron称之为外部网络 xff09 有
  • mysql in查询太慢, 使用join优化

    mysql中查询 in 参数太多 导致查询很慢 使用join优化 在实例中in查询话费2s 优化后0 4s span class token keyword SELECT span span class token operator spa
  • Springboot 多数据源事务,切换数据源+事务

    项目有多个数据源 根据配置文件配置的连接数来自动生成多数据源配置 并且使用 aop切换数据源 使用的是 AbstractRoutingDataSource 重写 determineCurrentLookupKey 方法 在切换数据源之前 6