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.mzph.cn/news/628839.shtml

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

相关文章

QT quick基础:组件gridview

组件gridview与android中gridview布局效果相同。下面记录qt quick该组件的使用方法。 方法一: // ContactModel.qml import QtQuick 2.0ListModel {ListElement {name: "1"portrait: "icons/ic_find.png"}ListElement {name: "2"por…

springboot+vue3+antdesignvue实现文件的导入导出javaguns框架

1.技术要点 mybatisplus;vue3,springboot2;javaguns框架 2实现导入功能 后端实现: ①controller层 RestController ApiResource(name "项目评价") public class ProjectAppraisalController {/*** 导入excel表数据* param file* return*/PostResour…

NineAi 新版AI系统网站源码 ChatGPT

简介: Nine AI.ChatGPT是基于ChatGPT开发的一个人工智能技术驱动的自然语言处理工具,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,真正像人类一样来聊天交流,甚至能完成撰写邮件、视频脚本、文案、翻译、代码,写论文等任务。 NineAi 新版A…

MYSQL第四次作业--多表查询

二、多表查询 1.创建student和score表 创建student表 创建score表。 CREATE TABLE score ( id INT(10) NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT , stu_id INT(10) NOT NULL , c_name VARCHAR(20) , grade INT(10) ); 2.为student表和score表增加记录 向student表插入记录的…

自定义类型详解(2)

文章目录 5. 通讯录的实现 5. 通讯录的实现 实现一个通讯录: 通讯录中保存人的信息: 名字年龄性别电话住址 通讯录中可以存放100个人的信息增加联系人删除指定联系人修改指定联系人查找指定联系人显示所有联系人的信息排序功能 首先,我们需要…

Python爬虫---scrapy框架---下载嵌套数据

./spider/movie.py文件 import scrapy from scrapy_movie_20240116.items import ScrapyMovie20240116Itemclass MovieSpider(scrapy.Spider):name "movie"# 如果是多页下载的话, 那么必须要调整的是allowed_domains的范围 一般情况下只写城名allowed_domains [&…

决战排序之巅(二)

决战排序之巅(二) 排序测试函数 void verify(int* arr, int n) 归并排序递归方案代码可行性测试 非递归方案代码可行性测试 特点分析 计数排序代码实现代码可行性测试 特点分析 归并排序 VS 计数排序(Release版本)说明1w rand( ) …

MATLAB - 加载预定义的机器人模型

系列文章目录 前言 一、 要快速访问常见的机器人模型,可使用 loadrobot 功能,该功能可加载市售的机器人模型,如 Universal Robots™ UR10 cobot、Boston Dynamics™ Atlas 人形机器人和 KINOVA™ Gen 3 机械手。探索如何生成关节配置并与机器…

小程序基础库与Android之间通信优化的可能

最近在学习graalvm,发现有一个graaljs项目,项目中介绍可以让java与JavaScript做数据转换,比如JavaScript中可以使用java的数据类型与结构。突然想到之前遇到的一个问题,小程序中开发的代码和基础库的部分代码都是j2v8来执行的&…

深入理解 Spark(二)SparkApplication 提交和运行源码分析

spark 核心流程 yarn-client yarn-cluster spark 任务调度 spark stage 级别调度 spark task 级别调度 失败重试和白名单 对于运行失败的 Task,TaskSetManager 会记录它失败的次数,如果失败次数还没有超过最大重试次数,那么就把它放回待调…

【Docker构建MySQL8.0镜像】

Docker构建MySQL8.0镜像 部署流程1. 拉取docker镜像2. 创建数据卷,存放MySQL数据3. 启动MySQL镜像4. 初始化sql放入MySQL镜像5. 执行MySQL脚本6. MySQL镜像打包7. MySQL镜像迁移 部署流程 1. 拉取docker镜像 docker pull mysql:8.0.35拉取成功后就可以看到镜像了&…

openxml获取sheet所有的数据二维数组

此代码假定您已经安装了OpenXML SDK,并且您有一个.xlsx文件的路径。\n\n请注意,续写的代码将获取指定工作表中的所有数据,包括空单元格,并将它们存储在一个二维数组中。如果工作表中有多个行和列,数组的大小将与工作表…

NFS(Network File System 网络文件服务)

一,nfs 简介 1,nfs 性质 NFS(Network File System 网络文件服务) 文件系统(软件)文件的权限 NFS 是一种基于 TCP/IP 传输的网络文件系统协议 通过使用 NFS 协议,客户机可以像访问本地目录一样…

【NI国产替代】NI-9231,8通道,51.2 kS/s/ch,-5至5 V,C系列声音和振动输入模块

8通道,51.2 kS/s/ch,-5至5 V,C系列声音和振动输入模块 NI-9231是一款高密度声音和振动模块,能够测量来自速度计、转速计和接近式探针等集成电子压电(IEPE)和非IEPE传感器的信号。该模块可以执行现代麦克风和加速计所需的高动态范围…

【Java万花筒】未来编码:深度了解Java中机器学习的核心库

构建智能系统:Java中的机器学习库全攻略 前言 随着人工智能和机器学习的不断发展,使用合适的库成为构建强大应用的关键一环。本文将深入介绍几个在Java生态系统中备受推崇的机器学习与人工智能库,为读者提供全面的了解和使用指南。每个库都…

verilog编程题

verilog编程题 文章目录 verilog编程题序列检测电路(状态机实现)分频电路计数器译码器选择器加减器触发器寄存器 序列检测电路(状态机实现) module Detect_101(input clk,input rst_n,input data,o…

56.Spring事务:事务四大特性

56.Spring事务:事务四大特性 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚, 因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。…

力扣每日一练(24-1-15)

重复n次检查&#xff0c;几乎都用双指针。。。 固然双指针就是题解&#xff1a; if len(nums) < 3:return len(nums)p1 2 for p2 in range(2, len(nums)):if nums[p2] ! nums[p1 - 2]:nums[p1] nums[p2]p1 1return p1 可以重复两次&#xff0c;那么隔一个检查就行&#…

【征服redis3】一文征服redis的jedis客户端

使用数据库的时候&#xff0c;我们可以用JDBC来实现mysql数据库与java程序之间的通信&#xff0c;为了提高通信效率&#xff0c;我们有了数据库连接池比如druid等等。而我们想通过Java程序控制redis&#xff0c;同样可以借助一些工具来实现&#xff0c;这就是redis客户端&#…

npm install 卡住不动的六种解决方法

1.重装 检查网络设置&#xff0c;删除node_modules重新npm install 2. 配置npm代理 // 配置nmp代理来提高速度&#xff0c;如设置淘宝镜像 npm config set registry https://registry.npm.taobao.org// 查看配置是否成功 npm config get registry// 成功后重新npm install安…