@Transactional注解作用,不生效的场景,事务回滚

news/2024/7/24 14:00:13/

在这里插入图片描述

目录

    • 一、@Transactional注解
    • 二、注解失效问题
      • 1、@Transactional 应用在非 public 修饰的方法上
      • 2、@Transactional 注解属性 rollbackFor 设置错误
      • 3、同一个类中方法调用,导致@Transactional失效
      • 4、捕获异常
    • 三、@Transactional回滚
      • 1、@Transactional
      • 2、@Transactional(rollbackFor = Exception.class)

一、@Transactional注解

声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。

简而言之,@Transactional注解在代码执行出错的时候能够进行事务的回滚。

  1. 在启动类上添加@EnableTransactionManagement注解。
  2. 用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。
  3. 在项目中,@Transactional(rollbackFor=Exception.class),如果类加了这个注解,那么这个类里面的方法抛出异常,就会回滚,数据库里面的数据也会回滚。
  4. 在@Transactional注解中如果不配置rollbackFor属性,那么事物只会在遇到RuntimeException的时候才会回滚,加上rollbackFor=Exception.class,可以让事物在遇到非运行时异常时也回滚。

二、注解失效问题

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

事务拦截器在目标方法执行前后进行拦截,内部会调用方法来获取Transactional 注解的事务配置信息,调用前会检查目标方法的修饰符是否为 public,不是 public则不会获取@Transactional 的属性配置信息。

2、@Transactional 注解属性 rollbackFor 设置错误

rollbackFor 可以指定能够触发事务回滚的异常类型。

Spring默认抛出了未检查unchecked异常(继承自 RuntimeException 的异常)或者 Error才回滚事务;其他异常不会触发回滚事务。

如果在事务中抛出其他类型的异常,但却期望 Spring 能够回滚事务,就需要指定rollbackFor属性。

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

开发中避免不了会对同一个类里面的方法调用,比如有一个类Test,它的一个方法A,A再调用本类的方法B(不论方法B是用public还是private修饰),但方法A没有声明注解事务,而B方法有。则外部调用方法A之后,方法B的事务是不会起作用的。这也是经常犯错误的一个地方。

那为啥会出现这种情况?其实这还是由于使用Spring AOP代理造成的,因为只有当事务方法被当前类以外的代码调用时,才会由Spring生成的代理对象来管理。

4、捕获异常

如果你手动的catch捕获这个异常并进行处理,事务管理器会认为当前事务应该正常commit,就会导致注解失效,如果非要捕获且不失效,就必须在代码块内throw new Exception抛出异常。

【Java基础知识 6】Java异常详解

在这里插入图片描述
Error是指不希望被捕获的错误,虚拟机抛出,无法使用trycatch进行捕获。

Exception是指可以使用trycatch捕获的异常,如果不适用trycatch进行补捕获,则当前线程终止。

三、@Transactional回滚

1、@Transactional

使用@Transactional后,当程序发生RuntimeException运行时异常在没有使用try,catch进行捕获的时候,程序都会中止,当程序发生中止,则会触发数据库的回滚。

当使用了trycatch进行捕获到这个异常,假如在catch中加入了throw e抛出异常,则程序中止,数据库回滚。

加入在try catch中没有throw e 抛出异常,只是简单的打印异常,则异常被捕获未抛出异常去终止程序,在trycatch中的操作数据库语句插入失败,在trycatch上面和下面的数据库相关插入语句成功,也就是程序成功跑完,数据库不会发生回滚。

2、@Transactional(rollbackFor = Exception.class)

在@Transactional注解中如果不配置rollbackFor属性,那么事物只会在遇到RuntimeException的时候才会回滚,加上rollbackFor=Exception.class,可以让事物在遇到非运行时异常时也回滚。

在这里插入图片描述

🏆本文收录于,Java基础教程(进阶篇)。

目前已经800+订阅,CSDN最强Java专栏,包含全部Java基础知识点、Java8新特性、Java集合、Java多线程、Java代码实例,理论结合实战,实现Java的轻松学习。

🏆哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师。


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

相关文章

开发yocto系统-1

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、需要的主机环境?二、下载 repo三、配置git四、下载源码五、定制自己的机器六、构建镜像总结 前言 本文将记录如何搭建一个yocto的开发环境 提示…

opencv实践项目-图像卡通化

目录 1.如何使图像卡通画2.铅笔素描滤波器3. 细节增强滤波器4. 双边过滤器5. 铅笔边缘滤波器 1.如何使图像卡通画 我们通常需要执行两个主要步骤将图像转换为卡通图像:边缘检测和区域平滑。 边缘检测的主要目的显然是为了强调图像的边缘,因为卡通图像通…

LeetCode刷题(ACM模式)-02链表

参考引用:代码随想录 注:每道 LeetCode 题目都使用 ACM 代码模式,可直接在本地运行,蓝色字体为题目超链接 0. 链表理论基础 0.1 链表定义 链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成&#xff1a…

【leetCode:剑指 Offer】20. 表示数值的字符串

1.题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。 数值(按顺序)可以分成以下几个部分: 若干空格 一个 小数 或者 整数 (可选)一个 e 或 E ,后面跟着一个 …

自动化测试2:selenium常用API

目录 1.webdirver API 1.1.定位元素 1.2CSS 1.语法 2,使用 1.3XPath定位 1.语法 2.使用 2.操作测试对象 2.1.鼠标点击与键盘输入 2.2submit 提交表单 2.3text 获取元素文本 3.添加等待 3.1.sleep休眠 3.2.智能等待 3.2.1.隐式等待 3.2.2显示等待 4.打印信息 …

【C语言】刷题训练营 —— 每日一练

文章目录 前言 BC113 小乐乐定闹钟BC114 小乐乐排电梯BC115 小乐乐与欧几里得BC116 小乐乐改数字BC107 矩阵转置BC117 小乐乐走台阶BC118 小乐乐与序列BC119 小乐乐与字符串BC121 小乐乐学编程BC122 小乐乐算平均分完结 前言 大家好,继续更新专栏 c_牛客&#xff0…

windows下修改PyCharm默认terminal 在Git Bash中使用conda

windows下修改PyCharm默认terminal & 在Git Bash中使用conda windows下修改PyCharm默认terminal在Git Bash中使用conda windows下修改PyCharm默认terminal PyCharm的terminal默认使用的是powershell,但是conda环境是通过cmd运行的,因此可以将PyChar…

JAVA软件测试(贝泽成熟度模型)

JAVA软件测试(贝泽成熟度模型) 贝泽成熟度模型Beizer’s Maturity Model 级别0:测试与调试相同 测试的基本、最不成熟的观点是级别0的观点——测试与调试相同。 在0级思维中,程序员让他们的程序进行编译,用一些任意的输入调试程序。 此视图…

KVM 创建虚拟机文档

KVM创建虚拟机: 1. 确认KVM是否已安装: 运行以下命令确认KVM是否已正确安装。 $ rpm -qa |grep qemu-kvmIf the return information contains [rootdev ~]# rpm -qa |grep qemu qemu-guest-agent-2.12.0-3.el7.x86_64 libvirt-daemon-driver-qemu-4.5…

任务33 统计成绩

系列文章 任务33 统计成绩 给出n个学生的m门考试的成绩表,每个学生的信息由学号、姓名以及各科成绩组成。对学生的考试成绩进行有关统计,并打印统计表。具体功能如下: (1)具有对学生信息的增、删(按学号)、查(按学号)、改(按学号)功能。 (2) 按总分高低次序,打…

LAMP框架的架构与环境配置

目录 一、LAMP架构的相关知识 1)LAMP架构的概述 2)LAMP架构搭建的流程 二、编译安装Apache 1)关闭防火墙,将安装Apache所需软件包传到/opt目录下 2)安装环境依赖包 3)配置软件模块 4)编…

改进YOLOv5/YOLOv8:结合华为诺亚VanillaNet Block模块:深度学习中极简主义的力量

YOLOv5结合华为诺亚VanillaNet Block模块 介绍核心代码加入YOLOv5yaml文件:运行结果论文: VanillaNet: the Power of Minimalism in Deep Learning 代码: https://link.zhihu.com/?target=https%3A//github.com/huawei-noah/VanillaNet 介绍 基础模型的核心是 "更多…

【Log】About these two years

文章目录 第一篇博客?成长收获的季节Future 第一篇博客? 第一次在CSDN发布博客,是当初我学习嵌入式的时候,那个时候我们做了一个大创,其中使用到了激光雷达,然后我就负责激光雷达部分代码的编写和设计&…

【论文总结】Composition Kills: A Case Study of Email Sender Authentication

构成杀伤力: 电子邮件发送者认证的案例研究 摘要 基于组件的软件设计是构建现代软件系统的一种主要工程方法。然而,由于不同组件之间对信息的解释可能不一致,这种编程范式产生了安全问题。在本文中,我们利用这种不一致来识别电子…

@Autowired和@Resource注解之间的关系区别,Bean的作用域和生命周期,Spring的执行流程

目录 一. Autowired 和 Resource 注解 二. Bean的作用域 1. singleton(单例模式) 2. prototype(原型模式)(多例模式) 3. 请求作用域:request 4. 会话作用域:session 三. Spring 的执行流程 四. Bean 的生命周期 1. 实例化 2. 设置属性 3. Bea…

抖音seo源码--开源,支持二开不加密

抖音seo源码,抖音seo矩阵系统源码技术搭建,抖音seo源码技术开发思路梳理搭建 开发思路: 抖音seo源码如何搭建?抖音seo排名优化系统软件部分源码分析,代码打包中。。。 场景:在 python 中,你可…

一文带你了解MySQL之optimizer trace神器的功效

前言: 对于MySQL 5.6以及之前的版本来说,查询优化器就像是一个黑盒子一样,你只能通过EXPLAIN语句查看到最后优化器决定使用的执行计划,却无法知道它为什么做这个决策。这对于一部分喜欢刨根问底的小伙伴来说简直是灾难&#xff1…

二线程序员的出路

最近长沙不太平。去年被动离职一拨人之后,HR一直强调降本增效,人人自危,挤走一拨人,反正会有大量内卷失败的一线程序员进来填坑。当然留就有人走,前同事除了几个出去搞培训创业(后面解散了)的之…

云计算(二):负载均衡概述

云计算(二):负载均衡概述 负载均衡简介负载均衡的原理负载均衡的类型负载均衡的应用 负载均衡简介 负载均衡SLB(Server Load Balancer)是一种广泛应用于计算机网络中的技术,它可以将网络流量按需分发到多个…

[Nacos] Nacos Server处理心跳请求 (八)

文章目录 1.InstanceController#beat()1.1 serviceManager.registerInstance()1.2 serviceManager.getService()1.3 处理本次心跳 1.InstanceController#beat() CanDistroPutMapping("/beat")Secured(parser NamingResourceParser.class, action ActionTypes.WRITE…