Spring高手之路-Spring事务失效的场景详解

目录

前言

@Transactional 应用在非 public 修饰的方法上

同一个类中方法调用,导致@Transactional失效

final、static方法

@Transactional的用法不对

@Transactional 注解属性 propagation 设置不当

@Transactional注解属性 rollbackFor 设置错误

用错注解

异常被捕获

数据库引擎不支持事务


前言

Spring中比较容易失效的就是通过@Transactional 定义的声明式事务,他在以下几个场景中会导致事务失效,首先,就是Spring的@Transactional是基于Spring的AOP机制实现的,而AOP机制又是基于动态代理实现的。那么如果代理失效了,事务也就会失效。

Spring高手之路-Spring的AOP失效场景详解-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_62262918/article/details/135614540?spm=1001.2014.3001.5502

1.@Transactional 应用在非 public 修饰的方法上

 @Transactionalprivate void privateMethod() {// 在这里执行事务操作}

2.同一个类中方法调用,导致@Transactional失效

public class MyService {@Transactionalpublic void methodA() {// 在这里执行一些业务逻辑}public void methodB() {// 在这里执行一些业务逻辑methodA()}
}

3.final、static方法

由于AOP是通过创建代理对象来实现的,而无法对final方法进行子类化和覆盖,所以无法拦截这些方法。
还有就是调用static方法,因为这类方法是属于这个类的,并不是对象的,所以无法被AOP

4.@Transactional的用法不对

@Transactional 注解属性 propagation 设置不当

详情可以看:

Spring高手之路-Spring事务的传播机制(行为、特性)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_62262918/article/details/135277125?spm=1001.2014.3001.5502

 @Transactional(propagation = Propagation.NOT_SUPPORTED)public void updateProduct(Product product) {try {// 更新产品信息productRepository.update(product);// 抛出异常throw new RuntimeException("Something went wrong");} catch (Exception e) {// 处理异常System.out.println("Caught exception: " + e.getMessage());}}

事务传播行为被设置为NOT_SUPPORTED,以非事务方式执行操作。

5.@Transactional注解属性 rollbackFor 设置错误

@Service
public class ProductService {@Autowiredprivate ProductRepository productRepository;@Transactional(propagation = Propagation.REQUIRED)public void updateProduct(Product product) {try {// 更新产品信息productRepository.update(product);// 抛出异常throw new Exception("Something went wrong");} catch (Exception e) {// 处理异常System.out.println("Caught exception: " + e.getMessage());}}
}

updateProduct方法中,虽然使用了@Transactional注解来管理事务,但是没有设置rollbackFor属性,因此默认情况下只会回滚RuntimeException及其子类异常,而不回滚其他类型的异常(如Exception)。当在try块中抛出Exception异常时,Spring并不会认为这是需要回滚事务的异常,所以事务不会被回滚。

6.用错注解

有的时候,你排查了很久,发现都没问题,但是还是不生效,然后找别人来帮你看,他上来就看了一下你用的@Transactional,发现并不是Spring中的,而是其他什么地方的,比如javax.transaction.Transactional ,这样也会导致事务失效

7.异常被捕获

异常被catch捕获但未抛出导致@Transactional失效

    @Transactionalpublic void updateProduct(Product product) {try {// 更新产品信息productRepository.update(product);} catch (Exception e) {// 处理异常System.out.println("Caught exception: " + e.getMessage());}}

8.数据库引擎不支持事务

既然底层的数据库引擎不支持,那肯定就没法生效

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

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

相关文章

Ubuntu中查看IP地址的常用命令及使用方法

在Ubuntu操作系统中,了解和查看IP地址是进行网络配置、故障排除以及连接其他设备的重要一步。 以下是几个常用的命令来查看IP地址: 一、ifconfig命令 输入ifconfig 输出如图所示,即为ip地址 如若提示没有ifconfig命令,则可以使用…

WordPress怎么禁用文章和页面古腾堡块编辑器?如何恢复经典小工具?

现在下载WordPress最新版来搭建网站,默认的文章和页面编辑器,以及小工具都是使用古腾堡编辑器(Gutenberg块编辑器)。虽然有很多站长说这个编辑器很好用,但是仍然有很多站长用不习惯,觉得操作太难了&#xf…

Oracle 隐式数据类型转换

目录 Oracle类型转换规则: 看如下实验: 1、创建一张表,字段id的类型为number,id字段创建索引,插入一条测试数据 2、我们做如下查询,id的值设置为字符型的1 3、查看执行计划: Oracle类型转换…

keil 开发软件MDK的安装

安装MDK 1、MDK简介 2、如何获取MDK 3、安装MDK和器件支持包 keil 开发软件keil的安装及项目工程文件构建 驱动安装 安装MDK 1、MDK简介 不同MDK版本的支持情况:https://www2.keil.com/mdk5/selector 2、如何获取MDK MDK软件下载:https://www.kei…

听力损失是不是只和年龄有关?听损还能恢复吗?……15秒带你看清真相

听力损失是一种常见的健康问题,它不仅影响我们的交流和生活质量,还可能增加精神疾病和认知障碍的风险。那么,你对听力损失有多少了解呢?你有没有遇到过关于听力损失的困惑或疑问呢? 为了帮助大家更好地认识和预防听力损…

从零开始的 dbt 入门教程 (dbt core 命令进阶篇)

引 根据第一篇文章的约定,我想通过接下来的几篇文章带大家进一步了解 dbt 的用法,原计划这篇文章我会介绍 dbt 命令的进阶用法,进一步认识 dbt 的配置以及如何创建增量表等等零零散散十几个方面的知识点,结果在我写完命令部分发现…

Java多线程并发篇----第二十四篇

系列文章目录 文章目录 系列文章目录前言一、Java 中用到的线程调度算法是什么?二、什么是线程组,为什么在 Java 中不推荐使用?三、为什么使用 Executor 框架?四、在 Java 中 Executor 和 Executors 的区别?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣…

用Kimi chat提取一本图书中提到的书名

读完一本很不错的书,想将书中所有提到的其他图书名整理记录下来,该怎么办?在AI出现之前,只能手动一个个复制粘贴,现在有了AI,应该可以借助AI的神奇力量快速整理好。 在kimi chat对话框中上传图书名称&…

浪花 - 用户信息展示+更新

1. 用户登录获取登录凭证 已登录的用户才能获取个人信息发送 Aixos 请求登录 const user ref();onMounted(async () > {const res await myAxios.get(/user/current);if (res.code 0) {console.log("获取用户信息成功");user.value res.data;} else {consol…

【ubuntu】ubuntu 20.04安装docker,使用nginx部署前端项目,nginx.conf文件配置

docker 官网:Install Docker Engine on Ubuntu 一、安装docker 1.将apt升级到最新 sudo apt update2.使用apt安装 docker 和 docker-compose (遇到提示输入y) sudo apt install docker.io docker-compose3.将当前用户添加到docker用户组 …

创建SERVLET

创建SERVLET 要创建servlet,需要执行以下任务: 编写servlet。编译并封装servlet。将servlet部署为Java EE应用程序。通过浏览器访问servlet。编写servlet 要编写servlet,需要扩展HttpServlet接口的类。编写servlet是,需要合并读取客户机请求和返回响应的功能。 读取和处…

逆向分析C++类的本质

面向对象的语言中,类这种语言特性是最基本也是最重要的东西。这篇博客记录下从汇编角度去理解类的本质是什么。创建一个对象的本质又是什么。 一.C语言中的结构体和C的类有啥区别 我们知道在C语言中,有语言本身自带的一些内置类型。比如int&#xff0c…