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

news2024/11/29 8:48:15

在这里插入图片描述

目录

    • 一、@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.coloradmin.cn/o/576474.html

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

相关文章

HUD(抬头显示)的方案介绍

目录 一、基于DLP3030-Q1的HUD电路设计 二、DLP3030-Q1的介绍 三、DLP3030-Q1工作原理 四、DLPC120-Q1DMD 显示控制器 五、TMS320F2802332 位 MCU 六、 HUD显示实例 HUD主板实例 七、HUD的软件环境 一、基于DLP3030-Q1的HUD电路设计 本设计采用了DLP3030-Q1 芯片组&…

H3C IPSec IKE野蛮模式

这里使用H3C模拟器。 H3C IPSec IKE野蛮模式,又称为IKE Main Mode,主要是在第一阶段(Phase 1)的过程中提供身份保护。它主要用于VPN隧道建立过程中的密钥交换。以下是配置步骤: 创建IKE提案: system-view…

vite源码分析之dev

最近研究socket, 所以就顺便看了一下vite源码, vite的热更新就是根据socket实现的, 所以正好记录一下. 前端任何脚手架的入口,肯定是在package.json文件中,当我们输入script命令时, 会经历什么样的步骤呢? 接下来我们一起来探索一下~~~ 入口-package.json 看下面就是一个普…

【C++】string介绍

String 前言为什么学习string类?string类的常用接口说明string类对象的常见构造析构函数赋值运算符重载[ ] 重载size和length迭代器字符串追加关于容量的函数insert和erasefindreplacec_strrfindfind_first_offind_first_not_offind_last_ofsubstrgetlineto_string …

linux+onenet可视化(图形化步骤)

文章目录 一、ONENET项目搭建1.1 ONENET注册1.2 创建产品与设备1.3 添加数据流 二、可视化配置 OneNET是由中国移动打造的PaaS物联网开放平台。平台能够帮助开发者轻松实现设备接入与设备连接,快速完成产品开发部署,为智能硬件、智能家居产品提供完善的物…

孤儿僵尸守护进程

孤儿僵尸守护进程 1. 孤儿进程:2. 僵尸进程:3. 守护进程:(重点) 1. 孤儿进程: 父进程退出,还没退出的子进程就变成了孤儿进程 不要怕,还有爷爷进程init: 孤儿进程将被init进程所收养,并由init进程对它们完成状态收集…

认识HTTP协议---2

hi,大家好,今天继续为大家带来HTTP协议相关的知识 认识请求报头 👀1.header 👀2.Content-Type,Content-Length 👀3.User-Agent 👀4.Referer 👀5.Cookie机制 小复习 进入正题之前我们先回忆一下之前的知识 http报…

牛客小白月赛73

A&#xff1a;最小的数字 A-最小的数字_牛客小白月赛73 (nowcoder.com) #include<bits/stdc.h> #define endl \n #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define int long long using namespace std; int n, m, k, A, B, N, M, K; const int ma…

22种transforms数据预处理方法

来源&#xff1a;投稿 作者&#xff1a;阿克西 编辑&#xff1a;学姐 建议搭配视频学习↓ 视频链接&#xff1a;https://ai.deepshare.net/detail/p_5df0ad9a09d37_qYqVmt85/6 1.数据增强&#xff08;data augmentation&#xff09; 数据增强又称为数据增广&#xff0c;数据…

docker安装单机nacos、rocketmq、reids、xxl-job、minio、elasticsearch、kibana、gogs、nginx

目录在右侧中部 启动容器报错 直接删除那个name后边的就可以 安装nacos 首先需要拉取对应的镜像文件&#xff1a;docker pull nacos/nacos-server 挂载目录&#xff1a; mkdir -p /mydata/nacos/logs/ #新建logs目录mkdir -p /mydata/nacos/init.d/ …

最小二乘估计心得

基本思想 存在一组观察值 ( x i , y i ) (x_i, y_i) (xi​,yi​)&#xff0c;其中 y i y_i yi​和 x i x_i xi​之间满足一定的线性关系&#xff0c;如 y a 0 f 0 ( x ) a 1 f 1 ( x ) . . . a m − 1 f m − 1 ( x ) y a_0 f_0(x) a_1 f_1(x) ... a_{m-1} f_{m-1}(x…

改进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 介绍 基础模型的核心是 "更多…

Terra-Luna归零一年后:信任重建、加密未来路在何方?

本月既是Terra-Luna归零的一周年&#xff0c;也是FTX崩溃的第六个月&#xff0c;而这两个事件分别代表着2022年加密市场连环爆的开始与高潮&#xff0c;引发了加密行业15年历史上最可怕的生存危机。 尽管今年市场行情有所回暖&#xff0c;比特币开年至今涨幅70%&#xff0c;以太…

【办公类-19-04】办公中的思考——幼儿姓名笔画数统计(单字、全名字)

结果展示--笔画数统计 背景需求 中6班幼儿都能够书写学号&#xff08;基本没有镜像了&#xff09;&#xff0c;于是我开始尝试让幼儿熟悉自己的“姓氏”&#xff0c;并书写姓氏&#xff08;单字&#xff09;。4位幼儿能够默写全名&#xff0c;3位幼儿可以默写名字中的某一个字…

3*5差值结构参照1分类迭代次数比较

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入有3个节点&#xff0c;训练集AB各由5张二值化的图片组成&#xff0c;让A中有6个1&#xff0c;B中全是1&#xff0c;排列组合A &#xff0c;统计迭代次数并排序。共收集到了181个不同的迭代次数&#xff0c;其中有4个 A-B 迭…

创建web后端程序(servlet程序搭建)

目录 一、Servlet概述 二、创建servlet程序 1.创建类继承HttpServlet 2.重写HttpServlet类中 service、destroy、init方法 3.重新启动服务器 一、Servlet概述 Server Applet的简称&#xff0c;用Java编写的服务器端的程序。它运行在web服务器中&#xff0c;web服务器负责…

路径规划算法:基于回溯搜索优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于回溯搜索优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于回溯搜索优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

Android逆向学习之Frida逆向与抓包实战学习笔记(持续更新中)

学习资料:《安卓Frida逆向与抓包实战》陈佳林/著 文章目录 基础环境第三章 Frida逆向入门之Java层hook3.1 frida基础3.1.3frida基础知识frida存在两种操作模式frida操作App的方式有两种 3.1.4Frida IDE配置 3.2 frida脚本入门3.2.1 frida脚本的概念3.2.2 Java层hook基础1.hook…

续---初识HTML!!!(结束篇)

续———初识HTML&#xff01;&#xff01;&#xff01; 一、表单 1.表单的作用 关于表单的作用&#xff1a;表单最大的作用就是收集用户的信息&#xff0c;用户填写表单&#xff0c;点击提交数据给服务器。 2.如何画出表单&#xff1f; 在HTML中我们采用form标签来画一个…

2023 (ICPC) Jiangxi Provincial Contest -- Official Contest

A. Drill Wood to Make Fire 输出即可 #include<bits/stdc.h> #define int long long #define x first #define y second using namespace std; const int N1100; typedef pair<int,int>pii;int m,n; int a[N][N];void solve() {int s,v,n;cin>>n>>s&…