【Spring】Spring事务失效问题

📫作者简介:小明java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于知名金融公司后端高级工程师。
🏆 2022博客之星TOP3 | CSDN博客专家 | 后端领域优质创作者 | CSDN内容合伙人
🏆 InfoQ(极客邦)签约作者、阿里云专家 | 签约博主、51CTO专家 | TOP红人、华为云享专家
🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~
🍅 文末获取联系 🍅 👇🏻 精彩专栏推荐订阅收藏 👇🏻
专栏系列(点击解锁)
学习路线(点击解锁)
知识定位
🔥Redis从入门到精通与实战🔥
Redis从入门到精通与实战
围绕原理源码讲解Redis面试知识点与实战
🔥MySQL从入门到精通🔥
MySQL从入门到精通
全面讲解MySQL知识与企业级MySQL实战 🔥计算机底层原理🔥
深入理解计算机系统CSAPP
以深入理解计算机系统为基石,构件计算机体系和计算机思维
Linux内核源码解析
围绕Linux内核讲解计算机底层原理与并发
🔥数据结构与企业题库精讲🔥
数据结构与企业题库精讲
结合工作经验深入浅出,适合各层次,笔试面试算法题精讲
🔥互联网架构分析与实战🔥
企业系统架构分析实践与落地
行业最前沿视角,专注于技术架构升级路线、架构实践
互联网企业防资损实践
互联网金融公司的防资损方法论、代码与实践
🔥Java全栈白宝书🔥
精通Java8与函数式编程
本专栏以实战为基础,逐步深入Java8以及未来的编程模式
深入理解JVM
详细介绍内存区域、字节码、方法底层,类加载和GC等知识
深入理解高并发编程
深入Liunx内核、汇编、C++全方位理解并发编程
Spring源码分析
Spring核心七IOC/AOP等源码分析
MyBatis源码分析
MyBatis核心源码分析
Java核心技术
只讲Java核心技术
本文目录
本文导读
一、Spring事务失效问题
1、访问权限问题
2、方法用final修饰
3、方法内部调用
4、未被spring管理
5、表不支持事务
6、多线程调用
7、未开启事务
二、事务不回滚问题解析
1、错误的传播特性
2、try...catch了异常
3、手动抛了别的异常
4、自定义回滚异常
总结
本文导读
Spring事务失效问题主要有访问权限问题、方法用final修饰、方法内部调用、未被spring管理、表不支持事务、多线程调用、未开启事务等原因。事务不回滚问题主要有错误的传播特性、try...catch了异常、手动抛了别的异常、自定义回滚异常。
一、Spring事务失效问题
1、访问权限问题
事务方法被定义成了private,这样会导致事务失效,spring要求被代理方法必须是public的。
在AbstractFallbackTransactionAttributeSource类的computeTransactionAttribute方法中有个判断,如果目标方法不是public,则TransactionAttribute返回null,即不支持事务。
也就是说,如果我们自定义的事务方法(即目标方法),它的访问权限不是public,而是private、default或protected的话,spring则不会提供事务功能
2、方法用final修饰
事务方法被定义成了final的,这样会导致事务失效。
spring事务底层使用了aop,也就是通过jdk动态代理或者cglib,帮我们生成了代理类,在代理类中实现的事务功能。但如果某个方法用final修饰了,那么在它的代理类中,就无法重写该方法,而添加事务功能。
3、方法内部调用
在某个Service类的某个方法中,调用另外一个事务方法。拥有事务的能力是因为spring aop生成代理了对象,但是这种方法直接调用了this对象的方法,所以不会生成事务,在同一个类中的方法直接内部调用,会导致事务失效。
解决方案:Service类中注入自己(@Autowired prvate ServiceA serviceA;)、新加一个Service类
4、未被spring管理
没加Controller、@Service、@Component、@Repository等注解
5、表不支持事务
6、多线程调用
两个方法不在同一个线程中(生成嵌套的线程),从而是两个不同的事务。
如果看过spring事务源码的朋友,可能会知道spring的事务是通过数据库连接来实现的。当前线程中保存了一个map,key是数据源,value是数据库连接。
7、未开启事务
springboot通过DataSourceTransactionManagerAutoConfiguration类,已经默默的帮你开启了事务。
如果使用spring项目,则需要在applicationContext.xml文件中,手动配置事务相关参数,如果没配置,事务不会生效的。

二、事务不回滚问题解析
1、错误的传播特性
在使用@Transactional注解时可以指定propagation参数的,spring目前支持7种传播特性
NEVER,这种类型的传播特性不支持事务,如果有事务则会抛异常
REQUIRED,REQUIRES_NEW,NESTED三种传播特性才会创建新事务
2、try...catch了异常
3、手动抛了别的异常
spring事务默认情况下只会回滚RuntimeException和Error,对于普通的Exception,它不会回滚。
4、自定义回滚异常
例如(@Transactional(rollbackFor = BusinessException.class)),抛的其他异常不会回滚
总结
Spring事务失效问题主要有访问权限问题、方法用final修饰、方法内部调用、未被spring管理、表不支持事务、多线程调用、未开启事务等原因。事务不回滚问题主要有错误的传播特性、try...catch了异常、手动抛了别的异常、自定义回滚异常。
相关文章:
【Spring】Spring事务失效问题
📫作者简介:小明java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于…...
WiFi 发射链路 MCS 自适应机制介绍
链路适配是指发射机选择最优的MCS向特定的接收机发送数据的过程。链路自适应算法的实现有其特殊性,但通常基于测量的数据包错误率(PER)。大多数算法监视PER并调整MCS以跟踪一个最佳的长期平均值,以平衡由于使用更高MCS发送更短数据包而减少的开销和由于更…...
【Linux常用命令】-文件写入相关
一、rm命令,文件删除 1.相关参数 -f(–force):强制删除文件或目录,无需确认。 -r(–recursive):递归地删除目录及其内容。 -i(–interactive):交…...
枚举的第一行
2023年11月26日 问题: 好奇enum的所声明的枚举类的第一行是什么 从java技术卷1中第五章5.6中,了解是枚举类的实例 验证 错误信息: 解释: 此时只有有参构造 在这个枚举类里不能使用空,大概意思是说不能使用空参创建实例 校验 在原有的基础上创建一个无参构造 结果:不再报错,第…...
LeetCode.707设计链表(链表相关操作一篇就够了)
LeetCode.707设计链表 1.问题描述2.解题思路3.代码 1.问题描述 你可以选择使用单链表或者双链表,设计并实现自己的链表。 单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。 如果是双…...
图论——二部图及其算法
什么是二部图 二部图的判定 例子1 任选一个节点染成红色 红色的邻居染成蓝色 蓝色邻居染成红色 例子2 这个不是二部图 无权二部图的最大匹配...
实现简单的操作服务器和客户端(下)
一、说明 描述:本教程介绍如何使用 simple_action_client 库创建斐波那契操作客户端。此示例程序创建一个操作客户端并将目标发送到操作服务器。 内容 代码代码解释编译运行操作客户端连接服务器和客户端...
第二十章 解读PASCAL VOC2012与MS COCO数据集(工具)
PASCAL VOC2012数据集 Pascal VOC2012官网地址:http://host.robots.ox.ac.uk/pascal/VOC/voc2012/ 官方发表关于介绍数据集的文章 《The PASCALVisual Object Classes Challenge: A Retrospective》:http://host.robots.ox.ac.uk/pascal/VOC/pubs/everi…...
FreeRTOS列表和列表项
目录 列表和列表项 关于列表的一些操作 初始化列表 初始化列表项 列表插入列表项 列表项末尾插入 重点 pxIndex指向的是什么 xItemValue存的是什么 vListInsertEnd()的插入位置 List的头尾在哪里? 通用链表的三种实现方式 方法一 方法二 方法三 总结 Fre…...
【go语言实现一个webSocket的一个demo】
go语言实现一个webSocket的一个demo 前端代码 <html lang"zh-CN"><head></head><body> <script type"text/javascript">// header(Access-Control-Allow-Origin:*);var sock null;var wsuri "ws://127.0.0.1:9999&…...
es6字符串模板之标签化模板
es6字符串模板 我们经常搞前端开发工作的都会用到。它可以保留字符串换行格式,还能接受变量。这个给前端的字符串拼接带来了非常大的方便。但是还有一种用法可能是我们平时还是没有怎么用到的。 styled-components 在项目中熟悉使用react的童鞋可能会用过styled-…...
opencv入门1.1:从视频或摄像头读取图像
cv::VideoCapture是 OpenCV 中用于从视频文件或摄像头捕获图像帧的类。它提供了各种方法和函数,用于读取和处理视频数据。 以下是对 cv::VideoCapture类的详细解释和说明: 1. 打开视频源 为了使用 cv::VideoCapture,我们首先需要打开一个视…...
【数据中台】开源项目(1)-LarkMidTable
LarkMidTable 是一站式开源的数据中台,实现中台的 基础建设,数据治理,数据开发,监控告警,数据服务,数据的可视化,实现高效赋能数据前台并提供数据服务的产品。 系统演示地址 : www.l…...
VUE简易购物车程序
目录 效果预览图 完整代码 效果预览图 完整代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>…...
如何清除redis缓存?
首先进入redis安装目录 当前目录下执行CMD命令(shift 右键 -> 选择 ‘在此处打开Powershell窗口’ ) 执行 redis-cli.exe -h 127.0.0.1 -p 6379flushall...
接收网络包的过程——从硬件网卡解析到IP层
当一些网络包到来触发了中断,内核处理完这些网络包之后,我们可以先进入主动轮询 poll 网卡的方式,主动去接收到来的网络包。如果一直有,就一直处理,等处理告一段落,就返回干其他的事情。当再有下一批网络包…...
正则化与正则剪枝
写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除! 文章目录 引言正则化为什么会过拟合拉格朗日与正则化梯度衰减与正则化 应用解决过拟合网络剪枝 …...
Element-Plus 图标自动导入
🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞…...
关于DCDC电源中的PWM与PFM
在开关电源DCDC中,我们经常会听到PWM模式与PFM模式。 关于,这两种模式,小编在之前的文章中,做过简单的描述。今天就来针对性的就这两种模式展开讲讲。 PWM:脉冲宽度调制,即频率不变,不断调整脉…...
S25FL系列FLASH读写的FPGA实现
文章目录 实现思路具体实现子模块实现top模块 测试Something 实现思路 建议读者先对 S25FL-S 系列 FLASH 进行了解,我之前的博文中有详细介绍。 笔者的芯片具体型号为 S25FL256SAGNFI00,存储容量 256Mb,增强高性能 EHPLC,4KB 与 6…...
Streamlit界面超友好!CLIP图文匹配工具,可视化结果一目了然
Streamlit界面超友好!CLIP图文匹配工具,可视化结果一目了然 1. 工具简介与核心价值 CLIP-GmP-ViT-L-14图文匹配测试工具是一款基于先进多模态模型的本地化测试解决方案。它完美解决了传统CLIP模型测试过程中的两大痛点:一是需要编写代码才能…...
VCNL4010集成光学传感器驱动与工程实践指南
1. VCNL4010传感器技术解析:集成式接近与环境光检测的工程实践指南 VCNL4010是Vishay公司推出的高集成度光学传感器芯片,将红外LED发射器、PIN光电二极管接收器、环境光传感器(ALS)、16位ADC、IC接口控制器及可编程中断逻辑全部集…...
手把手教程:基于Qwen2.5-VL的Chord视觉定位模型,快速部署与实战体验
手把手教程:基于Qwen2.5-VL的Chord视觉定位模型,快速部署与实战体验 1. 项目概述 Chord视觉定位模型是基于Qwen2.5-VL多模态大模型构建的智能视觉定位服务。它能理解自然语言描述,在图像中精确定位目标对象并返回边界框坐标,无需…...
Go语言的sync.RWMutex源码
Go语言中的并发控制利器:sync.RWMutex源码探秘 在Go语言的并发编程中,sync.RWMutex是一个高效且常用的读写锁实现。它允许多个读操作并发执行,而写操作则独占访问,这种设计显著提升了高并发场景下的性能表现。本文将深入分析sync…...
控制系统故障数据仿真模型与诊断程序:基于Simulink模拟执行机构及传感器故障研究并应用朴素...
【控制系统故障数据仿真模型与诊断程序】 1、 带执行机构的控制器Simulink仿真模型; 2、模拟执行机构、传感器的漂移故障、恒增益故障,以及噪声扰动; 3、诊断程序基于朴素贝叶斯和KNN算法。一、程序核心目标 通过KNN(K近邻)与朴素贝叶斯两种算…...
【Unity】Addressables插件实战:从零构建高效资源热更新方案
1. 为什么需要Addressables资源热更新 第一次接触Unity资源管理时,我像大多数新手一样直接使用Resources.Load。直到项目需要热更新时,才发现Resources文件夹下的所有内容都会被打进安装包,而且无法动态更新。后来改用AssetBundle,…...
Hashcat在Mac上的完整安装与使用指南:从零开始破解ZIP密码
Hashcat在Mac上的完整安装与使用指南:从零开始破解ZIP密码 如果你曾经遇到过忘记ZIP压缩包密码的尴尬情况,或者对密码恢复技术感兴趣,那么Hashcat绝对是你需要掌握的工具。作为世界上最快的密码恢复工具之一,Hashcat支持多种算法和…...
GreaterWMS:基于福特亚太售后物流实战经验的开源仓储管理系统架构解析
GreaterWMS:基于福特亚太售后物流实战经验的开源仓储管理系统架构解析 【免费下载链接】GreaterWMS This Inventory management system is the currently Ford Asia Pacific after-sales logistics warehousing supply chain process . After I leave Ford , I star…...
BMP183气压传感器驱动开发与高精度补偿实践
1. BMP183气压传感器驱动库技术解析与工程实践BMP183是由博世(Bosch)推出的高精度数字气压传感器,广泛应用于无人机高度计、气象站、可穿戴设备及工业环境监测等嵌入式系统中。该器件集成MEMS压阻式压力传感单元、温度传感元件及24位ADC&…...
《4.1深入理解内存管理:从静态分配到动态分配》
内存管理概述:程序运行的基石 上周排查一个嵌入式系统的死机问题,现象很诡异——设备连续运行48小时后必然卡死。抓取崩溃现场的内存dump,发现堆区数据被踩得一塌糊涂。指针像脱缰野马般指向了代码段区域,栈回溯显示最后一次操作是某个结构体链表的插入。最终定位到问题:…...
