Spring Transaction 指定事务管理器问题

一,单个数据源,单个事务管理器与@Transactional默认事务管理器名称不一致问题

在平时代码中使用声明性事务时,直接在方法上面加注解即可,如下

@Transactional(rollbackFor = Exception.class)

并没有指定事务管理器,为什么?

因为只有一个数据源,只有一个事物管理器。多数据源,多个事物管理器时才需要指定事务管理器

如下创建事物管理器

@Bean(name = "defaultTransactionManager")
@Primary
public DataSourceTransactionManager defaultDataSourceTransactionManager(@Qualifier("defaultDataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);
}

但是创建的事物管理器名称是 defaultTransactionManager 

@Transactional 注解中默认的事物器管理器是 transactionManager

为什么依然有效 

参考文章

千云物流- 多数据源事务管理_多数据源datasourcetransactionmanager-CSDN博客

SpringBoot手动开启事务:DataSourceTransactionManager-CSDN博客

【老王读Spring Transaction-7】一个数据源的事物管理配置 与 多数据源的事物管理配置_springboot 配置 @transactional 的数据源-CSDN博客

二,相关知识点

1,@Transactional注解不生效问题

常见情况:

1,方法内部调用:

一个类中,A方法调用加了事物注解的B方法;或A事物方法调用B事物方法,B事物依然不会生效

2,方法不是public

3,多数据源情况,事物管理器没有指定正确

4,@Transactional 注解属性 rollbackFor 设置错误

5,异常被catch了

6,自调用:事物方法A,内部调用的类中无事物方法B,如果B抛出异常,A方法其他内容不回滚

Spring @Transactional注解失效的情况及解决方法_@transactional注解不生效-CSDN博客

针对第六点方案有疑问

2,编程性事物 

为了解决大事物问题

3,SqlSessionFactory 创建

包含:如果是mybatisplus如何配置,如何指定xml路基

@Configuration
@MapperScan(basePackages = {"com.*","com.*"}, sqlSessionFactoryRef = "mallSqlSessionFactory")
public class DataBaseConfig {private static final Logger logger = LoggerFactory.getLogger(Constant.LOGGER);@Value("${spring.datasource.mall.druid.filters:stat}")private String filter;@Value("${spring.datasource.mall.druid.maxActive:20}")private int maxActive;@Value("${spring.datasource.mall.druid.minIdle:5}")private int minIdle;@Value("${spring.datasource.mall.druid.initialSize:5}")private int initialSize;@Value("${spring.datasource.mall.druid.maxWait:90000}")private int maxWait;@Value("${spring.datasource.mall.druid.timeBetweenEvictionRunsMillis:60000}")private int timeBetweenEvictionRunsMillis;@Value("${spring.datasource.mall.druid.minEvictableIdleTimeMillis:3000000}")private int minEvictableIdleTimeMillis;@Value("${spring.datasource.mall.druid.poolPreparedStatements:false}")private boolean poolPreparedStatements ;@Bean(name = "mallDataSource")@ConfigurationProperties(prefix = "spring.datasource.mall")public DataSource mallDataSource() {//指定使用DruidDataSourceDruidDataSource dataSource = (DruidDataSource) DataSourceBuilder.create().type(com.alibaba.druid.pool.DruidDataSource.class).build();try {dataSource.setInitialSize(initialSize);dataSource.setMinIdle(minIdle);dataSource.setMaxActive(maxActive);dataSource.setMaxWait(maxWait);dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);dataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);dataSource.setPoolPreparedStatements(poolPreparedStatements);dataSource.setFilters(filter);logger.info("初始化mallDataSource Druid监控配置成功");}catch (Exception e){logger.warn("初始化Druid监控配置失败");}return dataSource;}@Bean(name = "mallSqlSessionFactory")public SqlSessionFactory mallSqlSessionFactory(@Qualifier("mallDataSource") DataSource dataSource)throws Exception {MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();//SqlSessionFactoryBean bean = new SqlSessionFactoryBean();bean.setDataSource(dataSource);Interceptor[] plugins =  new Interceptor[]{new PageHelper()};bean.setPlugins(plugins);List<String> mapperLocations = new ArrayList<>();mapperLocations.add("classpath:mybatis/mappers/customer/*.xml");mapperLocations.add("classpath:mybatis/mappers/community/*.xml");Resource[] resources = resolveMapperLocations(mapperLocations);bean.setMapperLocations(resources);return bean.getObject();}@Bean(name = "mallTransactionManager")public PlatformTransactionManager mallTransactionManager(@Qualifier("mallDataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}@Bean(name = "mallSqlSessionTemplate")public SqlSessionTemplate mallSqlSessionTemplate(@Qualifier("mallSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {return new SqlSessionTemplate(sqlSessionFactory);}/*** 指定多路径*/private Resource[] resolveMapperLocations(List<String> mapperLocations) {ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();List<Resource> resources = new ArrayList();if (mapperLocations != null) {for (String mapperLocation : mapperLocations) {try {Resource[] mappers = resourceResolver.getResources(mapperLocation);resources.addAll(Arrays.asList(mappers));} catch (IOException e) {throw new RuntimeException(e);}}}return resources.toArray(new Resource[0]);}
}

   @Bean(name = "defaultSqlSessionFactory")@Primarypublic SqlSessionFactory defaultSqlSessionFactory(@Qualifier("defaultDataSource") DataSource dataSource)throws Exception {MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();bean.setDataSource(dataSource);Interceptor[] plugins = {paginationInterceptor};bean.setPlugins(plugins);bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/*.xml"));GlobalConfig globalConfig = new GlobalConfig();globalConfig.setMetaObjectHandler(new MyMetaObjectHandler());bean.setGlobalConfig(globalConfig);return bean.getObject();}

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

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

相关文章

探索直播美颜技术:计算机视觉在美颜SDK开发中的应用

下文&#xff0c;小编将深入探讨美颜技术在计算机视觉领域中的应用&#xff0c;特别是美颜SDK的开发过程&#xff0c;并剖析其技术原理和实现方法。 一、美颜技术的发展 这些算法往往难以满足用户对高质量美颜效果的需求&#xff0c;因此需要更加先进的技术手段来实现。 二、…

map与set容器常见操作详解(含示例代码及注意事项)

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生 &#x1f648;个人主页&#x1f389;&#xff1a;GOTXX &#x1f43c;个人WeChat&#xff1a;ILXOXVJE &#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&…

LeetCode-热题100:73. 矩阵置零

题目描述 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a; matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a; [[1,0,1],[0,0,0],[1,0,1]] 示例 2&…

企微侧边栏开发(内部应用内嵌H5)

一、背景 公司的业务需要用企业微信和客户进行沟通&#xff0c;而客户的个人信息基本都存储在内部CRM系统中&#xff0c;对于销售来说需要一边看企微&#xff0c;一边去内部CRM系统查询&#xff0c;比较麻烦&#xff0c;希望能在企微增加一个侧边栏展示客户的详细信息&#xf…

常见手撕项目C++

常见手撕项目C 设计模式单例模式饿汉模式懒汉模式 设计模式 单例模式 单例模式是一种常用的软件设计模式&#xff0c;其目的是确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取该实例。 优点&#xff1a; 资源控制&#xff1a;单例模式能够确保一个类只有一个实…

淘宝订单中的涉及红包检测、优惠券检测方案|工具|API

首先&#xff0c;检测订单红包的核心价值是什么&#xff1f; “红包的本质就是薅平台羊毛&#xff1a;不用怀疑&#xff0c;平台对于这种损害平台利益的行为肯定是最高等级的稽查”。那么&#xff0c;在日常运营中&#xff0c;需要尽可能过滤这类订单。 其次&#xff0c;如何使…

【数据结构 | 图论】如何用链式前向星存图(保姆级教程,详细图解+完整代码)

一、概述 链式前向星是一种用于存储图的数据结构&#xff0c;特别适合于存储稀疏图&#xff0c;它可以有效地存储图的边和节点信息&#xff0c;以及边的权重。 它的主要思想是将每个节点的所有出边存储在一起&#xff0c;通过数组的方式连接&#xff08;类似静态数组实现链表…

慧天【HTWATER】:水文水动力模型的革命性工具,城市内涝的精准解决方案

城市内涝水文水动力模型介绍 在城市排水防涝规划过程中&#xff0c;水文水动力耦合模型已经成为一种不可或缺的分析工具。在模型建立、城市内涝风险评估、排水系统性能诊断以及海绵城市规划等方面&#xff0c;内涝耦合模型提供了相应的模拟及分析工具&#xff1a; 1.1丰富的数…

前端学习<二>CSS基础——09-CSS案例讲解:博雅互动

前言 CSS已经学了一些基础内容了&#xff0c;我们来讲解一个小案例吧。以博雅互动的官网首页举例。 版心 首页的版心如下&#xff1a; 这里我们要普及一个概念&#xff0c;叫“版心”。版心是页面中主要内容所在的区域。 比如说&#xff0c;网站左上角的logo&#xff0c;设计…

Flutter 开发学习笔记(0):环境配置

文章目录 前言开发需求环境配置运行出现问题我运行也是解决了很久的问题镜像源设置为清华的镜像源&#xff08;不知道有没有影响&#xff09;使用JDK21&#xff0c;JDK版本不能低于JDK11手动下载flutter 对应的gradle 运行成功&#xff01; 前言 我最近一直在用Uniapp写代码&a…

vmware,linux,centos7,NAT模式下的网络配置

centos7的NAT网络配置 NAT模式说明虚拟机网络配置工具本机配置net8网络&#xff08;NAT的网域&#xff09;本机的IP配置(用于net8局域网内解析主机IP和域名对应关系使用)&#xff08;可选&#xff09;虚拟机内的网络配置虚拟机ping不通www.baidu.com的情况下虚拟机ping可以ping…

ARM64架构栈帧以及帧指针FP

文章目录 前言一、arm64架构寄存器简介1.1 异常等级1.2 通用寄存器1.3 ARM64架构ABI 二、ARM64架构函数调用标准2.1 AArch64过程调用标准简介2.2 通用寄存器中的参数 三、demo分析3.1 main函数3.2 funb3.3 funa 四、栈帧总结五、demo演示参考资料 前言 这篇文章描述了 x86_64架…

智过网:一建36岁好不好找工作?能干什么?

在职业发展的道路上&#xff0c;许多人在不同的年龄阶段都会面临不同的挑战和机遇。对于36岁这一年龄阶段的人来说&#xff0c;如果已经通过了国家一级建造师&#xff08;一建&#xff09;的考试&#xff0c;那么他们在找工作方面会有怎样的前景呢&#xff1f;又能从事哪些职业…

气象预测新篇章:Python人工智能的变革力量

Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;在数据处理、科学计算、数学建模、数据挖掘和数据可视化方面具备优异的性能&#xff0c;这些优势使得Python在气象、海洋、地理、气候、水文和生态等地学领域的科研和工程项目中得到广泛应用。可以…

20.变量的使用方式和注意事项

文章目录 一、变量的用法二、变量的注意事项三、总结 一、变量的用法 代码示例 public static void main(String[] args) {//1.基本用法// 定义变量&#xff0c;再进行输出int a 10;System.out.println(a);// 10System.out.println(a);// 10//2.变量参与计算int b 30;int c …

代码随想录学习Day 21

回溯算法理论基础 回溯法又叫回溯搜索法。回溯是递归的副产品&#xff0c;有递归就会有回溯&#xff0c;回溯操作一般出现在递归函数的下面。回溯函数 递归函数。回溯法的本质是穷举。 回溯法解决的问题&#xff1a; 组合问题&#xff1a;N个数里面按一定规则找出k个数的集…

【超图 SuperMap3D】【基础API使用示例】51、超图SuperMap3D - 绘制圆|椭圆形面标注并将视角定位过去

前言 引擎下载地址&#xff1a;[添加链接描述](http://support.supermap.com.cn/DownloadCenter/DownloadPage.aspx?id2524) 绘制圆形或者椭圆形效果 核心代码 entity viewer.entities.add({// 圆中心点position: { x: -1405746.5243351874, y: 4988274.8462937465, z: 370…

小狐狸JSON-RPC:钱包连接,断开连接,监听地址改变

detect-metamask 创建连接&#xff0c;并监听钱包切换 一、连接钱包&#xff0c;切换地址&#xff08;监听地址切换&#xff09;&#xff0c;断开连接 使用npm安装 metamask/detect-provider在您的项目目录中&#xff1a; npm i metamask/detect-providerimport detectEthereu…

vue2的孙子传值给爷爷,爷爷传值给孙子

孙---->爷 在爷爷组件&#xff0c;给父亲组件绑定一个方法 定义一个方法用来接受传来的值 在父亲组件中 给孙子组件绑定v-on“$listeners” 在孙子组件 在特定掉件触发下&#xff0c;将值穿过去&#xff0c;注意&#xff1a;这里的this.$emit的名字要跟爷爷绑定的一…

R语言赋值符号<-、=、->、<<-、->>的使用与区别

R语言的赋值符号有&#xff1c;-、、-&#xff1e;、&#xff1c;&#xff1c;-、-&#xff1e;&#xff1e;六种&#xff0c;它们的使用与区别如下: <-’&#xff1a;最常用的赋值符号。它将右侧表达式的值赋给左侧的变量&#xff0c;像一个向左的箭头。例如&#xff0c;x …