SpringBoot多数据源配置之事务管理

SpringBoot多数据源配置之事务管理

  • 1.Spring编程式事务
    • 1.1 简单案例
  • 2.mybatis多数据源事务
    • 2.1 简单mybatis项目结构
    • 2.2 application.yml配置
    • 2.3 读写数据源配置
  • 3.测试

1.Spring编程式事务

Spring编程式事务是一种通过编写具体代码来实现事务管理的方式。 在编程式事务中, 开发人员需要手动编写代码来控制事务的开始、提交和回滚等操作。

1.1 简单案例


@RestController
@RequestMapping("/user")
public class UserController {@AutowiredTransactionTemplate transactionTemplate;@AutowiredUserDao userDao;@PostMapping("/a")public void insertUser1(@RequestBody User user){transactionTemplate.execute(new TransactionCallback<Object>(){@Overridepublic Object doInTransaction(TransactionStatus status) {try {userDao.inserUser(user);
//                    int a=1/0;return "ok";}catch (Exception e){e.printStackTrace();status.setRollbackOnly();return null;}}});}
}

直接注入TransactionTemplate即可

2.mybatis多数据源事务

2.1 简单mybatis项目结构

在这里插入图片描述

2.2 application.yml配置

spring:datasource:datasource1:driver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3306/test_masterusername: rootpassword: rootdruid:initial-size: 1min-idle: 1max-active: 20test-on-borrow: truedatasource2:driver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3306/test_slaveusername: rootpassword: rootdruid:initial-size: 1min-idle: 1max-active: 20test-on-borrow: truemain:allow-bean-definition-overriding: truemybatis:type-aliases-package: com.rql.entity
#  mapper-locations: classpath:mybatis/*/*.xml

2.3 读写数据源配置

RMybatisConfig.java
@Configuration
@MapperScan(basePackages = "com.rql.mapper.r",sqlSessionFactoryRef = "rsqlSessionFactory")
public class RMybatisConfig {@Bean@ConfigurationProperties(prefix = "spring.datasource.datasource2")public DataSource dataSource2(){return DataSourceBuilder.create().build();}@Beanpublic SqlSessionFactory rsqlSessionFactory() throws Exception {SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();sqlSessionFactoryBean.setDataSource(dataSource2());sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/r/*.xml"));return sqlSessionFactoryBean.getObject();}@Beanpublic DataSourceTransactionManager rTransactionManager() {DataSourceTransactionManager datasource2TransactionManager =new DataSourceTransactionManager();datasource2TransactionManager.setDataSource(dataSource2());return datasource2TransactionManager;}@Beanpublic TransactionTemplate rtransactionTemplate() {return new TransactionTemplate(rTransactionManager());}
}

这里面配置了当前数据源的事务:

    @Beanpublic DataSourceTransactionManager rTransactionManager() {DataSourceTransactionManager datasource2TransactionManager =new DataSourceTransactionManager();//指定事务对应的数据源     datasource2TransactionManager.setDataSource(dataSource2());return datasource2TransactionManager;}//将该数据源事务Bean注入Spring容器@Beanpublic TransactionTemplate rtransactionTemplate() {return new TransactionTemplate(rTransactionManager());}
WMybatisConfig.java
@Configuration
//继承mybatis
//1.basePackages:指定扫描的mapper接口包(主库)
//2.sqlSessionFactoryRef:指定使用sqlSessionFactory是哪个
@MapperScan(basePackages = "com.rql.mapper.w",sqlSessionFactoryRef = "wsqlSessionFactory")
public class WMybatisConfig {@Bean@ConfigurationProperties(prefix = "spring.datasource.datasource1")public DataSource dataSource1(){return DataSourceBuilder.create().build();}@Bean@Primarypublic SqlSessionFactory wsqlSessionFactory() throws Exception {SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();sqlSessionFactoryBean.setDataSource(dataSource1());sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/w/*.xml"));return sqlSessionFactoryBean.getObject();}@Bean@Primarypublic DataSourceTransactionManager wTransactionManager() {DataSourceTransactionManager datasource1TransactionManager =new DataSourceTransactionManager();datasource1TransactionManager.setDataSource(dataSource1());return datasource1TransactionManager;}@Beanpublic TransactionTemplate wtransactionTemplate() {return new TransactionTemplate(wTransactionManager());}
}

3.测试

@RestController
@RequestMapping("user")
public class UserController {@Autowiredprivate RUserMapper rUserMapper;@Autowiredprivate WUserMapper wUserMapper;@AutowiredTransactionTemplate rtransactionTemplate;@AutowiredTransactionTemplate wtransactionTemplate;/** 当指定某一个数据源事务Bean为primary时,当出现异常时,事务回滚* 如果所有的数据库操作是在异常之前完成的,那么就无法做到* 所有的数据源回滚。异常之后的语句是不会执行的。* */@PostMapping("/ab")@Transactionalpublic void saveAll(){wUserMapper.inserUser(new User(10,"lili"));int a=1/0;rUserMapper.inserUser(new User(12,"long"));}@PostMapping("/abc")public void saveAll1(){wtransactionTemplate.execute((wstatus)->{rtransactionTemplate.execute((rstatus)->{try {wUserMapper.inserUser(new User(10,"lili"));rUserMapper.inserUser(new User(10,"lili"));
//                   int a=1/0;}catch (Exception e){e.printStackTrace();wstatus.setRollbackOnly();rstatus.setRollbackOnly();return false;}return true;});return true;});}}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何用ChatGPT进行论文撰写?

原文链接&#xff1a;如何用ChatGPT进行论文撰写&#xff1f;https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247601619&idx1&snb686fbe87dedfac2df3a6afe780b2ffe&chksmfa820c34cdf5852251dca64597024ea62ddbde280086535ec251f4b62b848d9f9234688384e6…

vim使用指南:指令、配置、插件、异常

文章目录 vi / vim命令模式插入模式光标定位复制粘贴删除撤销替换删除查找 底行模式保存退出行号查找多开其他 视图模式注释 异常vim配置vim插件 vi / vim vim的本质是一个编辑器&#xff0c;是一种多模式的编辑器&#xff0c;只能进行读写操作&#xff0c;不能进行编译编辑器…

Windows系统下安装paddle

开始使用_飞桨-源于产业实践的开源深度学习平台 (paddlepaddle.org.cn) 命令行下&#xff1a; python -m pip install --upgrade pip --user python -m pip install paddlepaddle2.6.1 -i https://pypi.tuna.tsinghua.edu.cn/simple 报异常 ERROR: Could not install packa…

ADOP-400G光模块问题发布会

前沿光学&#xff08;ADOP&#xff09;400G光模块为客户提供各种超高密度的400G以太网连接方案&#xff0c;广泛应用于数据中心、企业网和服务提供商。 &#x1f4e3;&#x1f4e3;以下一些问题是我们新一代400G光模块常能遇见问题&#xff0c;所以我们决定在这里开一场小小的…

书生·浦语大模型第二期实战营(4)笔记

Finetune 为什么要微调 适应下游任务 两种微调范式 上面的是增量训练 下面的是指令微调 数据格式 微调方案 lora&#xff1a; 在基座模型的基础上再套用一个小模型 XTuner 简介 快速上手 LnternLM2 1.8B 多模态LLM

qt-C++笔记之获取当前文件名所在路径并拼接出新文件路径的一种方法

qt-C笔记之获取当前文件名所在路径并拼接出新文件路径的一种方法 code review! 运行 在 Qt 框架中&#xff0c;QFileInfo 和 QDir类通常用于文件系统信息的查询和目录管理。下面是按照这样一种新颖的步骤来拼接新文件路径的示例代码&#xff1a; #include <QFileInfo>…

智慧煤矿/智慧矿区视频汇聚存储与安全风险智能分析平台建设思路

一、建设背景 目前我国非常重视煤矿安全生产&#xff0c;并投入大量资金用于煤矿安全综合远程监控系统的研发。视频监控系统作为实现煤矿智能化无人开采的关键系统与煤矿安全生产的多系统协同分析与处理的关键信息源&#xff0c;在智慧矿山管控平台的建设中发挥着重要的作用。…

数据结构书后习题

p17 1&#xff0c; 个人解答&#xff1a; int DeleteMinElem(SqList &L,int &min) {int j 0;if (L.length 0){printf("error!");return 0;}int min L.data[0];for (int i 1; i < L.length; i){if (L.data[i] < min){min L.data[i];j i;}}L.dat…

Docker八股总结

1. 容器和虚拟机的区别 传统虚拟机技术是虚拟出一套硬件后&#xff0c;在其上运行一个完整操作系统&#xff0c;在该系统上再运行所需应用进程&#xff1b;而容器内的应用进程直接运行于宿主的内核&#xff0c;容器内没有自己的内核&#xff0c;而且也没有进行硬件虚拟。因此容…

【MATLAB源码-第191期】基于matlab的4QAM系统相位偏移估计EOS算法仿真,对比补偿前后的星座图误码率。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 引言 M-QAM调制技术的重要性 现代通信系统追求的是更高的数据传输速率和更有效的频谱利用率。M-QAM调制技术&#xff0c;作为一种高效的调制方案&#xff0c;能够通过在相同的带宽条件下传输更多的数据位来满足这一需求。…

EasyImage2.0 简单图床开源 多功能 简单易用图床系统源码

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 支持API 支持仅登录后上传 支持设置图片质量 支持压缩图片大小 支持文字/图片水印 支持设置图片指定宽/高 支持上传图片转换为指定格式 支持限制最低宽度/高度上传 支持上传其他文件格…

突破“三个九”!离子阱量子计算再创新高

如果把量子计算比作一场球赛&#xff0c;Quantinuum无疑又打了一记漂亮的好球。实际上&#xff0c;结合今年春季在量子体积、逻辑量子比特和布线问题等方面的进展&#xff0c;这个团队已经接近于完成一场完美的比赛。 3月&#xff0c;Quantinuum的研究人员证明了QCCD架构的可扩…

Linux学习之路 -- PCB介绍 -- 进程优先级

1、什么是优先级&#xff1f; 进程需要某一种资源&#xff0c;而系统要通过特定的方式来决定谁先获得这些资源&#xff0c;而系统的做法就是给不同的进程安排不同的优先级。让优先级高的进程先享有一些资源。 2、为什么要有优先级 因为资源的缺乏&#xff0c;所以系统的才会…

C# 开源 工业相机库 调用海康相机 大恒相机

C# MG.CamCtrl 工业相机库 介绍一、使用案例二、使用介绍1、工厂模式创建实例2、枚举设备&#xff0c;初始化3、启动相机4、取图5、注销相机 三、接口1、相机操作2、启动方式3、取图4、设置/获取参数 介绍 c# 相机库&#xff0c;含海康、大恒品牌2D相机的常用功能。 底层采用回…

Django模型的字段选项

每一种字段类型都需要指定一些特定的参数。例如&#xff0c;CharField&#xff08;及其子类&#xff09;需要接收一个max_length参数&#xff0c;用以指定数据库存储VARCHAR数据时的字节数。 一些可选的参数是通用的&#xff0c;可以用于任何字段类型&#xff0c;下面具体介绍…

访问学者申请的成功经验

在申请成为访问学者时&#xff0c;经验是至关重要的。下面知识人网小编将介绍一些可以帮助您成功申请的经验和技巧。 首先&#xff0c;了解目标机构或大学的研究方向和需求是非常重要的。在申请之前&#xff0c;仔细研究该机构的学术项目、研究成果以及教授的专业领域&#xff…

C++笔试强训day2

目录 1.牛牛的快递 2. 最小花费爬楼梯 3.数组中两个字符串的最小距离 1.牛牛的快递 链接 单纯分类讨论&#xff0c;不加赘述。 详细代码&#xff1a; #include <iostream> using namespace std; #define ll long long int main() { float mg; char st; cin >>…

[C++][算法基础]最大公约数(欧几里得算法)

给定 n 对正整数 ,&#xff0c;请你求出每对数的最大公约数。 输入格式 第一行包含整数 n。 接下来 n 行&#xff0c;每行包含一个整数对 ,。 输出格式 输出共 n 行&#xff0c;每行输出一个整数对的最大公约数。 数据范围 1≤n≤, 1≤,≤2 输入样例&#xff1a; 2 3 …

C/C++基础----内存相关

malloc分配内存 用法 参数为要开辟内存的大小&#xff08;字节为单位&#xff09;返回值为void*,所以要强转一下语法&#xff1a;malloc()动态开辟20个字节的内存&#xff0c;代码&#xff1a;#include <iostream>using namespace std;int main() {int *a (int *) mal…

基于Hadoop的电商用户行为分析系统设计与实现的系统架构设计

采集层&#xff1a;利用Flume采集电商服务器端用户行为数据&#xff0c;把数据处理后发送至HDFS。 存储层&#xff1a;用户行为数据采集上传至HDFS存储&#xff0c; 导入到数据仓库Hive进行计算处理&#xff0c;分析结果保存至MySql数据库中。 计算层&#xff1a;根据分析需求建…