Spring事务失效的几种场景

news/2025/2/21 20:04:16/

往期推荐

符号引用和直接引用、强引用、软引用、弱引用、虚引用-CSDN博客

已老实!再学消息队列、死信队列-CSDN博客

synchronized如何实现可重入,和Lock区别-CSDN博客

Mysql索引失效的几种场景、回表、索引覆盖、索引下推-CSDN博客

1. 未启用Spring事务管理功能或bean没有被spring管理

2. @Transactional修饰的方法非public或被final、static修饰

3. 同类的方法A直接调用同类的事务方法B

spring事务是通过Spring AOP实现的,对需要spring管理事务的bean生成了代理对象,然后通过代理对象拦截了目标方法的执行,在方法前后添加了事务的功能,所以必须通过代理对象调用目标方法的时候,事务才会起效。如果方法A直接调用方法B则是this调用,即该类的类对象,就不是代理对象。可以通过Service 类中注入自己,或者通过AopContext.currentProxy()获取代理对象来解决。

4. 抛出的异常类型错误

在业务方法进行异常抛出,spring会自动对事务进行回滚,那么问题来了,抛出哪些异常spring会回滚事务呢?默认情况下,spring遇到RuntimeException和Error的事务才会回滚。因为spring认为RuntimeException和Error是不可预期的错误,而而受检异常是可预期的错误,可以通过业务逻辑即可解决。

当然也可以自定义回滚异常类型@Transactional(rollbackFor = {异常类型列表})

5. 异常被捕获处理

spring感知到指定异常被抛出才会进行回滚,如果在方法内部捕获处理掉异常,事务就不会回滚

java">@Transactional
public void m1(){事务操作1try{事务操作2,内部抛出了异常}catch(Exception e){log.error(....)   }
}

正确做法是捕获处理掉异常后抛出来,如下:

java">@Transactional
public void m1(){事务操作1try{事务操作2,内部抛出了异常}catch(Exception e){log.error(....)   throw e}
}

6. 事务操作和@Transactional方法不在同一线程

java">@Transactional
public void m1() {new Thread() {一系列事务操作}.start();
}

7. 事务传播行为设置不对

spring默认事务传播行为默认是required,事务方法A内部调用事务方法B,如果方法A存在事务则方法B加入方法A的事务,否则创建新事务。如果非事务方法A调用事务方法B,事务传播级别为NOT_SUPPORT,因为方法A当前不存在事务,则方法B虽然有@Transactional注解,但仍然以非事务去执行。


http://www.ppmy.cn/news/1572787.html

相关文章

吃瓜教程Day2笔记

作为“西瓜书”介绍机器学习模型的开篇,线性模型也是机器学习中最为基础的模型,很多复杂模型 均可认为由线性模型衍生而得,无论是曾经红极一时的支持向量机还是如今万众瞩目的神经网络,其中都有线性模型的影子。 本章的线性回归和…

火爆的DeepSeek大模型怎么和智能家居结合?

DeepSeek作为AI大模型,与智能家居结合可以带来更智能、个性化和自然交互的体验,以下是几种可能的结合方式及场景示例: 自然语言控制中枢 场景示例:用户说“我有点冷”,DeepSeek自动调高空调温度并关闭风扇;…

第1章大型互联网公司的基础架构——1.5 服务发现

讲到这里,我们已经对一个客户端请求进入业务HTTP服务的过程有了较为详细的了解。业务HTTP服务在处理请求的过程中免不了与其他下游服务通信——可能会调用其他业务服务,可能需要访问数据库,可能会向消息中间件投递消息等,所以业务…

(arxiv2411) TinyViM: Frequency Decoupling for Tiny Hybrid Vision Mamba

论文:https://arxiv.org/abs/2411.17473 代码:https://github.com/xwmaxwma/TinyViM 作者提出了一种 Convolution-Mamba 的混合架构TinyViM,架构如下图所示。可以看出方法的核心是 Laplace Mixer。 Laplace mixer: 作者首先通过实验&#xff…

算法学习笔记之贪心算法

导引(硕鼠的交易) 硕鼠准备了M磅猫粮与看守仓库的猫交易奶酪。 仓库有N个房间,第i个房间有 J[i] 磅奶酪并需要 F[i] 磅猫粮交换,硕鼠可以按比例来交换,不必交换所有的奶酪 计算硕鼠最多能得到多少磅奶酪。 输入M和…

高效构建与配置高可用负载均衡集群:从理论到实践的全面实施

1. 主机配置 主机IPVIP角色本机客户端OpenEuler-1172.25.254.10172.25.254.100虚拟服务器 (VS)OpenEuler-2172.25.254.12172.25.254.100真实服务器 (RS1)OpenEuler-3172.25.254.13172.25.254.100真实服务器 (RS2) 2. 真实服务器 (RS) 配置与优化 # 安装与配置 Nginx [rootOpe…

网络安全——网络安全基础、常用网络命令

网络安全基础 什么是网络分层? 张老板送王老板十箱啤酒 ​ 张老板秘书收到指示,联系王老板秘书要来对方地址 ​ 张老板秘书交代给张老板秘书的实习生,给这个地址发货 ​ 张老板秘书的实习生联系王老板秘书的实习生要来收件人 联系方式 …

Task03:Ollama API 的使用

Ollama API 使用指南 简介 Ollama 提供了强大的 REST API,使开发者能够方便地与大语言模型进行交互。通过 Ollama API,用户可以发送请求并接收模型生成的响应,应用于自然语言处理、文本生成等任务。本文将详细介绍生成补全、对话生成的基本…