spring boot事务(springboot事务效率问题)

本文目录
springboot事务效率问题
Spring通过AOP进行事务的控制,如果操作数据库报异常,则会进行回滚;如果没有报异常则会提交事务。但是,有时候Spring事务会失效,本文将介绍Spring的事务何时会失效,以及如何避免事务失效。
情景1:
springboot 手动开启事务以及手动提交事务
添加依赖,sprongboot 会默认开启事务管理
org.springframework.boot
spring-boot-starter-jdbc
在需要的服务类里添加注解
springboot在weblogic中的事务失效问题
记录下最近项目中遇到的坑,关于事务的问题,我们的项目使用springboot构建,并且我们的连接池使用的是druid,在本地直接使用springboot打好jar包,
一切正常行,然后将项目打包成war包,上到weblogic中,运行也正常,但是一次导入excel表的case中,导入失败了,但是数据没有回滚!经过测试才发现在weblogic中springboot管理的事务失效了,马上查询资料,经过几小时的谷歌后找到了解决办法,在weblogic中放弃自己的连接池,转而使用weblogic中的jndi数据源。
配置步骤如下:
spring事务失效的几种场景以及原因
spring事务失效场景可能大家在很多文章都看过了,所以今天就水一篇,看大家能不能收获一些不一样的东西。直接进入主题
失效原因: spring事务生效的前提是,service必须是一个bean对象
解决方案: 将service注入spring
失效原因: spring默认只会回滚非检查异常和error异常
解决方案: 配置rollbackFor
失效原因: spring事务只有捕捉到了业务抛出去的异常,才能进行后续的处理,如果业务自己捕获了异常,则事务无法感知
解决方案:
1、将异常原样抛出;
2、设置TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
失效原因: spring事务切面的优先级顺序最低,但如果自定义的切面优先级和他一样,且自定义的切面没有正确处理异常,则会同业务自己捕获异常的那种场景一样
解决方案:
1、在切面中将异常原样抛出;
2、在切面中设置TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
失效原因: spring事务默认生效的方法权限都必须为public
解决方案:
1、将方法改为public;
2、修改TansactionAttributeSource,将publicMethodsOnly改为false【这个从源码跟踪得出结论】
3、开启 AspectJ 代理模式【从spring文档得出结论】
具体步骤:
1、在pom引入aspectjrt坐标以及相应插件
2、在启动类上加上如下配置
注: 如果是在idea上运行,则需做如下配置
4、直接用TransactionTemplate
示例:
失效原因: 子容器扫描范围过大,将未加事务配置的serivce扫描进来
解决方案:
1、父子容器个扫个的范围;
2、不用父子容器,所有bean都交给同一容器管理
注: 因为示例是使用springboot,而springboot启动默认没有父子容器,只有一个容器,因此就该场景就演示示例了
失效原因: 因为spring事务是用动态代理实现,因此如果方法使用了final修饰,则代理类无法对目标方法进行重写,植入事务功能
解决方案:
1、方法不要用final修饰
失效原因: 原因和final一样
解决方案:
1、方法不要用static修饰
失效原因: 本类方法不经过代理,无法进行增强
解决方案:
1、注入自己来调用;
2、使用@EnableAspectJAutoProxy(exposeProxy = true) + AopContext.currentProxy()
失效原因: 因为spring的事务是通过数据库连接来实现,而数据库连接spring是放在threadLocal里面。同一个事务,只能用同一个数据库连接。而多线程场景下,拿到的数据库连接是不一样的,即是属于不同事务
失效原因: 使用的传播特性不支持事务
失效原因: 使用了不支持事务的存储引擎。比如mysql中的MyISAM
注: 因为springboot,他默认已经开启事务管理器。org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration。因此示例略过
失效原因: 当代理类的实例化早于AbstractAutoProxyCreator后置处理器,就无法被AbstractAutoProxyCreator后置处理器增强
本文列举了14种spring事务失效的场景,其实这14种里面有很多都是归根结底都是属于同一类问题引起,比如因为动态代理原因、方法限定符原因、异常类型原因等
***隐藏网址***

更多文章:
计算机网络协议指的是tcp ip协议(TCP/IP协议是什么)
2025年10月21日 07:15
oracle数据库备份文件后缀(ORACLE 数据库导出的数据文件 什么后缀)
2026年4月7日 10:45
新加坡marina square风景(新加坡Marina Bay Sands空中花园设计欣赏)
2026年4月3日 10:45
datagridview设置表头(Datagridview表头样式设置)
2026年9月3日 13:45
mysql workbench查看表结构(在使用mysqlworkbench6.3怎么查看mysql数据库的关系图)
2025年7月31日 04:30
curl访问地址(php curl访问本地测试地址 链接超时,什么原因.公网可以)
2026年2月15日 19:15
object后面接什么(高中英语 object 意思为“拒绝“时的用法 后面跟什么)
2026年6月30日 19:00
win10系统java环境变量设置(win10怎么配置java环境变量path)
2025年6月16日 13:45
jquerytrigger参数(怎么给jquery方法传值 就是点击第2个button后执行第一个button的方式 怎么给s传值)
2025年11月5日 00:15
selective tool教程(selective tool能卸载吗)
2025年5月30日 06:30















