【spring】@Transactional 注解失效的原因及解决办法

文章目录

  • 前言
  • 一、@Transactional 属性介绍
    • 1.事务的传播行为:propagation
    • 2.事务的隔离级别:isolation
    • 3.事务的超时时间:timeout
    • 4.事务的回滚类型:rollbackFor
  • 二、@Transactional 失效场景
    • 1.同一个类中方法调用,注解失效
    • 2.异常被 catch “吃了”,注解失效
    • 3.@Transactional 应用在非 public 修饰的方法上
    • 4.@Transactional 注解属性 rollbackFor 设置错误
    • 5.@Transactional 注解属性 propagation 设置错误
    • 6.数据库引擎不支持事务
  • 总结


前言

面试中经常会被问到事务失效的场景有哪些,其实在开发中,若是不了解事务失效的场景,当你觉得加了事务,就会回滚,就大错特错了,今天就来了解一下吧。


提示:以下是本篇文章正文内容,下面案例可供参考

一、@Transactional 属性介绍

1.事务的传播行为:propagation

这就是我们常说的事务的七种传播行为,默认值:Propagation.REQUIRED

属性解释
Propagation.REQUIRED如果当前存在事务,则加入该事务,如果当前不存在事务,则创建一个新的事务。
Propagation.SUPPORTS如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务的方式继续运行。
Propagation.MANDATORY如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出异常。
Propagation.REQUIRES_NEW重新创建一个新的事务,如果当前存在事务,暂停当前的事务。
Propagation.NOT_SUPPORTED以非事务的方式运行,如果当前存在事务,暂停当前的事务。
Propagation.NEVER以非事务的方式运行,如果当前存在事务,则抛出异常。
Propagation.NESTED嵌套事务。

2.事务的隔离级别:isolation

这就是我们常说的事务的隔离级别,默认值:Isolation.DEFAULT

属性解释
Isolation.DEFAULT使用底层数据库默认的隔离级别
Isolation.READ_UNCOMMITTED读未提交
Isolation.READ_COMMITTED读已提交
Isolation.REPEATABLE_READ可重复读
Isolation.SERIALIZABLE串行化

3.事务的超时时间:timeout

  • timeout :事务的超时时间,默认值为 -1。如果超过该时间限制但事务还没有完成,则自动回滚事务。

4.事务的回滚类型:rollbackFor

  • rollbackFor :用于指定能够触发事务回滚的异常类型,可以指定多个异常类型。

二、@Transactional 失效场景

1.同一个类中方法调用,注解失效

场景重现:当调用 saveCabinet 方法时,save 方法中出异常不会回滚,如下代码

@Service
public class CabinetServiceImpl implements CabinetService {@Autowiredprivate CabinetMapper cabinetMapper;@Overridepublic void saveCabinet(Cabinet cabinet) {save(cabinet);}@Transactional(rollbackFor = Exception.class)public void save(Cabinet cabinet) {cabinetMapper.insert(cabinet);int i = 1/0;	// 模拟出错}
}

原因分析:spring 中采用动态代理来实现事务,当同一个类调用 save 时,不是代理类在调用,所以扫描不到事务注解

解决方案1:将 save 方法提到另一个类中,saveCabinet 调用另一个类的 save 方法(推荐使用)

// 当前类
@Service
public class CabinetServiceImpl implements CabinetService {@Autowiredprivate MethodTest methodTest;@Overridepublic void saveCabinet(Cabinet cabinet) {methodTest.save(cabinet);}
}
// 另一个类
@Service
public class MethodTest {@Autowiredprivate CabinetMapper cabinetMapper;@Transactional(rollbackFor = Exception.class)public void save(Cabinet cabinet) {cabinetMapper.insert(cabinet);int i = 1/0; 	// 模拟出错}
}

解决方案2:在 CabinetServiceImpl 中自己注入自己,用自己的代理类调用 save 方法,即 cabinetServiceImpl.save()

@Service
public class CabinetServiceImpl implements CabinetService {@Autowiredprivate CabinetMapper cabinetMapper;@Autowiredprivate CabinetServiceImpl cabinetServiceImpl;@Overridepublic void saveCabinet(Cabinet cabinet) {cabinetServiceImpl.save(cabinet);}@Transactional(rollbackFor = Exception.class)public void save(Cabinet cabinet) {cabinetMapper.insert(cabinet);int i = 1/0;	// 模拟出错}
}

2.异常被 catch “吃了”,注解失效

场景重现:当调用 saveCabinet 方法时,方法体被 try-catch 了,不会回滚,如下代码

@Service
public class CabinetServiceImpl implements CabinetService {@Autowiredprivate CabinetMapper cabinetMapper;@Override@Transactional(rollbackFor = Exception.class)public void saveCabinet(Cabinet cabinet) {try {cabinetMapper.insert(cabinet);int i = 1/0;	// 模拟出错} catch (Exception e) {e.printStackTrace();}}
}

原因分析:异常直接捕获没有向上抛出,而是自己处理了,注解捕获不到异常,所以失效

解决方案:将 catch 到的异常向上抛出 throw new Exception(e);,异常交给注解处理

@Service
public class CabinetServiceImpl implements CabinetService {@Autowiredprivate CabinetMapper cabinetMapper;@Override@Transactional(rollbackFor = Exception.class)public void saveCabinet(Cabinet cabinet) throws Exception {try {cabinetMapper.insert(cabinet);int i = 1/0;	// 模拟出错} catch (Exception e) {e.printStackTrace();throw new Exception(e);}}
}

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

  • 场景重现:当调用的方法不是 public 修饰时,不会回滚,事务失效
  • 原因分析:在 spring aop 代理时,事务拦截器会在目标方法的执行前后进行拦截,其中的方法会去获取 Transactional 注解的一些信息,而其中的方法会去检查目标方法是否被 public 修饰,不是的话获取不到注解信息
  • 解决方案:将调用的方法访问修饰符改为 public

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

场景重现:当注解没有指定 rollbackFor 属性时,如下若抛出 FileNotFoundException 异常则不会回滚

@Service
public class CabinetServiceImpl implements CabinetService {@Autowiredprivate CabinetMapper cabinetMapper;@Override@Transactionalpublic void saveCabinet(Cabinet cabinet) throws IOException {cabinetMapper.insert(cabinet);// 模拟出错throw new FileNotFoundException();}
}

原因分析:spring 默认抛出未检查异常,继承 RuntimeException 或者 Error 才会回滚,其他异常如 FileNotFoundException 则不会回滚

解决方案:指定 rollbackFor 属性,一般指定 @Transactional(rollbackFor = Exception.class) 即可,也可以指定自定义异常

@Service
public class CabinetServiceImpl implements CabinetService {@Autowiredprivate CabinetMapper cabinetMapper;@Override@Transactional(rollbackFor = Exception.class)public void saveCabinet(Cabinet cabinet) throws IOException {cabinetMapper.insert(cabinet);// 模拟出错throw new FileNotFoundException();}
}

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

  • 使用了不支持事务的传播属性

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

  • 数据库不支持事务

总结

一生太短了,我想为每一天发生的开心事情而庆祝。即使没有,我也要为“今天没有发生糟糕的事情”而庆祝。即使发生了,我也要为“又熬过人生中一件糟糕的事情”而庆祝。

在这里插入图片描述

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

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

相关文章

Visual Studio+C#实现信道与信息率失真函数

1. 要求 设计一款信道与信息率失真函数计算系统,要求如下: 系统能够通过输入的转移概率矩阵计算对称以及非对称离散无记忆信道的信道容量系统能够通过输入的概率分布以及失真矩阵来计算与信息率失真函数有关的相关参数,例如Dmin&#xff0c…

分布式学习笔记

1. CAP理论 Consistency(一致性):用户访问分布式系统中的任意节点,得到的数据必须一致。 Availability(可用性):用户访问集群中的任意健康节点,必须得到相应,而不是超时…

vue3-渲染机制

渲染机制 Vue 是如何将一份模板转换为真实的 DOM 节点的,又是如何高效地更新这些节点的呢?我们接下来就将尝试通过深入研究 Vue 的内部渲染机制来解释这些问题。 虚拟 DOM 你可能已经听说过“虚拟 DOM”的概念了,Vue 的渲染系统正是基于这…

基于Java SSM框架实现精准扶贫管理系统项目【项目源码】计算机毕业设计

基于java的SSM框架实现精准扶贫管理系统演示 JSP技术介绍 JSP技术本身是一种脚本语言,但它的功能是十分强大的,因为它可以使用所有的JAVA类。当它与JavaBeans 类进行结合时,它可以使显示逻辑和内容分开,这就极大的方便了用户的需…

一文了解Web3.0真实社交先驱ERA

Web2时代,少数科技巨头垄断了全球近60亿人口的网络社交数据,并用之为自己牟利,用户无法掌控个人数据,打破该局面逐渐成为共识,于是,不少人看到了Web3社交赛道蕴含的巨大机遇,标榜着去中心化和抗…

【STM32】硬件SPI读写W25Q64芯片

目录 基础知识回顾: SPI外设简介 SPI框图 主模式全双工连续传输 非连续传输 初始化SPI外设 核心代码 - 交换一个字节 硬件接线图 Code 程序配置过程 MySPI.c MySPI.h W25Q64.c W25Q64.h W25Q64_Ins.h main.c 基础知识回顾: 【STM32】SP…

php实现讯飞星火大模型3.5

前期准备 vscode下载安装好 composer下载安装好 php环境安装好 (以上可以自行网上查阅资料) 开始实现 1.注册讯飞星火用户,获取token使用 讯飞星火认知大模型-AI大语言模型-星火大模型-科大讯飞 2.修改对应php文件中的key等 可以参考…

【精选】Java面向对象进阶——接口和抽象类的案例

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏 …

『运维备忘录』之 SSH 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等知识,甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作,持续给大家更新运维工作所需要接触到的知识点,希望大…

C++学习:list

1.list的定义和结构 list的使用频率不高,在做题时几乎遇不到需要使用list的情景。list是一种双向链表容器,它是标准模板库(STL)提供的一种序列容器。list容器以节点(node的形式存储元素,并使用指针将这些节点链接在一起,形成一个…

苹果电脑深度清理工具CleanMyMac X2025中文版

苹果电脑用户们,你们是否经常感到你们的Mac变得不再像刚拆封时那样迅速、流畅?可能是时候对你的苹果电脑进行一次深度清理了。在这个时刻,拥有一些高效的深度清理工具就显得尤为重要。今天,我将介绍几款优秀的苹果电脑深度清理工具…

java的泛型【详解】

定义类、接口、方法时&#xff0c;同时声明了一个或者多个类型变量&#xff08;如&#xff1a;<E>&#xff09; &#xff0c;称为泛型类、泛型接口&#xff0c;泛型方法、它们统称为泛型。 作用&#xff1a;泛型提供了在编译阶段约束所能操作的数据类型&#xff0c;并自…

【Python】【Pycharm】Python Script头文件设置

1、步骤&#xff1a;File->settings->Editor->File and CodeTemplates->Python Script 2、复制粘贴以下代码&#xff0c;应用即可&#xff1a; #!/usr/bin/env python # -*- coding: utf-8 -*-# Time :${DATE} ${TIME} # Author : admin # Site :${SITE} …

数据库应用:kylin 部署 达梦数据库DM8

目录 一、实验 1.环境 2.部署前规划 3.部署达梦数据库DM8 4.创建数据库及数据库事例管理 5.达梦数据库的基本操作 二、问题 1.xhost命令报错 2.执行安装程序DMInstall.bin 报错 3.解压安装程序报错 4.安装程序找不到文件 5.图像化界面打不开 6.安装内存太小 7.打开…

【HarmonyOS】【DevEco ohpm ERROR: NOTFOUND package “@ohos/hypium“如何解决

参考 &#xff1a;&#xff08;无效&#xff09; 华为开发者论坛 DevEco创建项目时的错误解决_6 月 优质更文活动_路北路陈_InfoQ写作社区 解决&#xff1a; HormonyOS-DevEco Studio新建空项目ERROR解决_oh_modules\ohos\hypium-CSDN博客 将 .ohpm文件夹中的hypium文件夹复…

【Node-RED】安全登陆时,账号密码设置

【Node-RED】安全登陆时&#xff0c;账号密码设置 前言实现步骤密码生成setting.js 文件修改 安全权限 前言 Node-RED 在初始下载完成时&#xff0c;登录是无账号密码的。基于安全性考虑&#xff0c;本期博文介绍在安全登陆时&#xff0c;如何进行账号密码设置。当然&#xff…

相机图像质量研究(35)常见问题总结:图像处理对成像的影响--运动噪声

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

备战蓝桥杯 Day5

1191&#xff1a;流感传染 【题目描述】 有一批易感人群住在网格状的宿舍区内&#xff0c;宿舍区为n*n的矩阵&#xff0c;每个格点为一个房间&#xff0c;房间里可能住人&#xff0c;也可能空着。在第一天&#xff0c;有些房间里的人得了流感&#xff0c;以后每天&#xff0c;得…

【python】python入门之计算

“数字”&#xff1a; 介绍一下不同形式的数字们 字符串“6”数字6浮点数6.0 注意&#xff1a;输入时的内容自定义为字符串&#xff0c;需要用int&#xff08;&#xff09;进行强制转换 优先级&#xff1a; 常见优先级如下&#xff08;优先级指的是一个算式中先算的部分&…

产品经理学习-产品运营《流程管理》

如何进行流程管理 信息可视化 甘特图-流程管理思维导图-方案讨论原型图-活动文档 明确责任制 分工明确&#xff0c;关键环境有主负责人通过时间倒推督促管理 沟通技巧 明确共同利益以结果激励做好信息同步 如何进行监控活动效果 监控活动的效果是要监控数据 活动每个环境的…