Spring Boot 中的事务回滚规则

news2025/2/24 10:03:29

Spring Boot 中的事务回滚规则

在应用程序中,事务管理是一个重要的概念。事务是指一系列的操作,这些操作要么全部成功,要么全部失败。在Spring Boot中,我们可以使用事务管理器来管理事务。在使用事务管理器的时候,一个非常重要的概念就是事务回滚。

在这里插入图片描述

什么是事务回滚

事务回滚是指当事务执行失败时,将所有已经执行的操作全部撤销,使它们回到事务开始时的状态。这样可以保证数据的一致性和完整性。在Spring Boot中,事务回滚是由Spring框架来实现的。

Spring Boot 中的事务回滚规则

Spring Boot默认情况下,只有在抛出RuntimeException或Error时,才会发生事务回滚。这是因为RuntimeException和Error通常是由Java虚拟机抛出的,它们是无法被捕获的异常,因此Spring无法对它们进行处理,只能回滚事务。

在Spring Boot中,我们可以使用@Transactional注解来控制事务的回滚。这个注解可以放在方法上,也可以放在类上。如果它放在类上,那么所有的方法都将继承这个注解。

@Transactional注解有一些非常重要的属性,包括rollbackFornoRollbackForrollbackFor用来指定哪些异常会触发事务回滚,noRollbackFor用来指定哪些异常不会触发事务回滚。

@Transactional(rollbackFor = Exception.class, noRollbackFor = RuntimeException.class)
public void doSomething() {
    // ...
}

在上面的代码中,rollbackFor属性指定了所有的异常都会触发事务回滚,而noRollbackFor属性指定了RuntimeException和其子类的异常不会触发事务回滚。

另外,Spring Boot还提供了一个@Transactional(propagation = Propagation.REQUIRED)注解,用来控制事务的传播行为。这个注解有很多属性,其中最常用的是Propagation.REQUIRED。它表示如果当前已经存在一个事务,那么就使用这个事务;如果当前不存在事务,那么就创建一个新的事务。

Spring Boot 中的事务原理

在Spring Boot中,事务是由Spring框架来管理的。Spring框架使用了AOP(面向切面编程)技术来实现事务的管理。具体来说,Spring框架通过代理机制来实现事务的管理。

当一个方法被@Transactional注解修饰时,Spring会为这个方法创建一个代理对象。当这个方法被调用时,实际上是调用了代理对象的方法。代理对象在方法执行前会开启一个事务,在方法执行后根据执行结果来决定是提交事务还是回滚事务。

Spring框架使用了一个TransactionInterceptor拦截器来实现事务管理。这个拦截器会在方法执行前后进行拦截,并根据事务的传播行为和异常情况来决定是开启一个新的事务还是使用已经存在的事务,并在方法执行后根据执行结果来决定是提交事务还是回滚事务。

Spring Boot 中的事务使用

在Spring Boot中,我们可以使用@Transactional注解来控制事务的回滚。在使用@Transactional注解时,需要注意以下几点:

  1. @Transactional注解只能放在public方法上。
  2. 方法必须是非静态的。
  3. 如果在同一个类中调用了带有@Transactional注解的方法,那么事务将不会起作用。这是因为Spring是通过代理来实现事务管理的,而代理只能在方法调用时生效。
  4. 如果在一个类中同时存在多个带有@Transactional注解的方法,那么这些方法将共享同一个事务。
  5. 在使用@Transactional注解时,一定要确保注解配置正确,否则可能会导致事务无法回滚或者回滚不完全的情况。

下面是一个使用@Transactional注解的例子:

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    @Transactional(rollbackFor = Exception.class)
    public void addUser(User user) {
        userRepository.save(user);
        // ...
    }

}

在上面的例子中,addUser()方法使用了@Transactional注解来控制事务的回滚。如果在方法执行过程中发生了异常,那么事务将会回滚,保证数据的一致性和完整性。

除了使用@Transactional注解外,Spring Boot还提供了一些其他的方式来管理事务,包括编程式事务管理和声明式事务管理。这些方式的具体实现可以参考Spring Boot官方文档。

总结

事务回滚是保证数据的一致性和完整性的重要手段。在Spring Boot中,事务回滚是由Spring框架来实现的。Spring框架使用了AOP技术来实现事务的管理,通过代理对象来控制事务的回滚。在使用事务时,我们可以使用@Transactional注解来控制事务的回滚,同时也需要注意注解的配置和使用方式。除了使用@Transactional注解外,Spring Boot还提供了其他的方式来管理事务,开发者可以根据具体情况选择最适合自己的方式。

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

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

相关文章

ElasticSearch——复合查询

Elasticsearch 语雀(完整笔记) 复合(compound)查询:复合查询可以将其它简单查询组合起来,实现更复杂的搜索逻辑。常见的有两种: fuction score:算分函数查询,可以控制…

《计算机系统与网络安全》第七章 身份认证

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

【单片机】STM32单片机读取旋转编码器,TIM定时器捕获

文章目录 旋转编码器介绍主程序逻辑直接检测用外部中断检测下降沿定时器直接解码旋转编码器 旋转编码器介绍 旋转编码器简单来说,就是会输出2个PWM,依据相位可以知道旋转方向,依据脉冲个数可以知道旋转的角度。一般旋转一圈有一个固定数值的…

chatgpt赋能python:Python输出\n的用法及优势

Python 输出\n 的用法及优势 在Python编程语言中,我们常常需要输出字符串,并在特定地方换行。在这种情况下,使用\n是一种非常方便的方式。在本文中,我们将详细介绍Python的输出\n的用法及其优势。 什么是\n? \n是一…

Spark17-18-19

17. Spark执行流程 17.1 创建SparkContext 使用spark-submit脚本,会启动SparkSubmit进程,然后通过反射调用我们通过--class传入类的main方法,在main方法中,就行我们写的业务逻辑了,先创建SparkContext,向M…

YOLOv5-7.0添加BottleNet transformer

YOLOv5主干特征提取网络为CNN网络,CNN具有平移不变性和局部性,缺乏全局建模长距离建模的能力,引入自然语言领域的Transformer可以形成CNNTransFormer架构,充分结合两者的优点,提高目标检测效果。 1. BoTNet 论文地址…

BeautifulSoup爬取豆瓣电影数据

BeautifulSoup爬取豆瓣TOP250 豆瓣爬取地址 https://movie.douban.com/top250?formattext BeautifulSoup官网地址 https://www.rddoc.com/doc/BeautifulSoup/4.5.3/zh/quick-start/ 安装所需函数库 pip install beautifulsoup4pip install lxmlpip install requests导入…

IIS安装localhost显示下载,urlrewrite设置

1.取消ftp服务勾选 2. ping localhost ping 127.0.0.1 如果显示 ::1 则需要禁用ipv6 在注册表 找到并单击下面的注册表子项: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters\ 双击“DisabledComponents”以修…

Git2023最新版下载与安装教程(Windows版)

Windows版Git下载与安装教程 1. 下载Git2. 安装Git3. 配置Git 1. 下载Git 打开Git官网下载地址:https://git-scm.com/downloads 点击Download for Windows 选择git版本进行下载 2. 安装Git 双击安装包 点击Next 选择Git的安装路径,点击Next 选择…

【Html】js+css实现平滑滚动

效果 示例 <!DOCTYPE html> <html><head><title> Document </title><style>button{bottom: 0;position: fixed;z-index: 999;left: 0;background: rgb(94, 171, 255);border: 1px red;color: white;font-size: large;font-family: ;}img{…

C++、Redis读取base64格式的图像记录

C、Redis读取base64格式的图像记录 一、案例需求 1.另一台电脑利用C#和Redis将图像数据按照base64格式&#xff0c;存储在某一个key中 2.本机需要使用C和Redis将图像数据获取到&#xff0c;并写入本地。 环境&#xff1a;Ubuntu20、Redis、QT 二、Qt中的Pro文件配置 QT中的…

深度学习记录1(线性回归的实现)

1、整体思路 根据线性回归的定义&#xff0c; &#xff0c;建立线性回归模型&#xff0c;在损失函数的计算上&#xff0c;采用L2 Loss&#xff08;均方误差&#xff09;。同时&#xff0c;对于模型的优化采用随机梯度下降。 2、详细代码分析 import random import torch from…

Day7——Web安全基础下

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 回顾前言一、owasp top 10漏洞&#xff08;了解&#xff09;&#xff08;四年一更&#xff09;1.访问控制崩溃2.敏感数据暴露3.sql注入4.不安全的设计5.安全配置不当…

【单片机】STM32单片机的各个定时器的定时中断程序,标准库

文章目录 定时器1_定时中断定时器2_定时中断定时器3_定时中断定时器4_定时中断定时器5_定时中断 高级定时器和普通定时器的区别&#xff08;https://zhuanlan.zhihu.com/p/557896041&#xff09;&#xff1a; 定时器1_定时中断 TIM1是高级定时器&#xff0c;使用的时钟总线是R…

使用Megascans,Blender和Substance 3D画家创建渔人旅馆(p2)

今天云渲染小编接着Polina Tarakanova分享的Fishermans Inn项目上篇分享&#xff0c;下篇主要是纹理和材料、组装场景、照明等方面的分享。 纹理和材料 随着酒馆的模块化建设完成&#xff0c;是时候进入贴图阶段了。我使用Substance 3D Painter进行了所有的贴图工作。在我的场…

【网站创建】网络杂谈(6)之web网站的创建

涉及知识点 如何创建web网站&#xff0c;web网站创建的步骤&#xff0c;手把手教你如何搭建web网站&#xff0c;web网站创建的过程&#xff0c;深入了解web网站创建。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码》&#xff0c;更多内容可去其主页关注下哈&#xff0c;不胜感…

基于Java+SpringBoot+Vue的计算机类考研交流平台设计与实现

博主介绍&#xff1a;擅长Java、微信小程序、Python、Android等&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案例…

React-View-UI组件库封装Loading加载中源码

目录 组件介绍Loading API能力组件源码组件测试源码组件库线上地址 组件介绍 Loading组件是日常开发用的很多的组件&#xff0c;这次封装主要包含两种状态的Loading&#xff0c;旋转、省略号&#xff0c;话不多说先看一下组件的文档页面吧&#xff1a; 正在上传…重新上传取…

掌握imgproc组件:opencv-图像变换

图像变换 1. 基于OpenCV的边缘检测1.1 边缘检测的一般步骤1.2 canny算子1.2.1 Canny边缘检测步骤&#xff1a;1.2.2 Canny边缘检测&#xff1a;Canny()函数1.2.3 Canny边缘检测案例 1.3 sobel算子1.3.1 sobel算子的计算过程1.3.2 使用Sobel算子&#xff1a;Sobel()函数1.3.3 示…

模拟高并发下RabbitMQ的削峰作用

在并发量很高的时候&#xff0c;服务端处理不过来客户端发的请求&#xff0c;这个时候可以使用消息队列&#xff0c;实现削峰。原理就是请求先打到队列上&#xff0c;服务端从队列里取出消息进行处理&#xff0c;处理不过来的消息就堆积在消息队列里等待。 可以模拟一下这个过…