当前位置: 首页 > news >正文

Spring 事务的使用、隔离级别、@Transactional的使用



        Spring事务是Spring框架提供的一种机制,用于管理应用程序中的数据库事务。

        事务是一组数据库操作的执行单元,要么全部成功提交,要么全部失败回滚,保证数据的一致性和完整性。

Spring事务提供了声明式事务和编程式事务两种方式:

  1. 编程式事务: 编程式事务是通过编写代码来手动管理事务的开始、提交或回滚,开发人员需要显式地调用事务管理器的方法来控制事务的边界。

  2. 声明式事务: 声明式事务是通过在配置文件或注解中声明事务的属性来实现的。开发人员只需要关注业务逻辑,而不需要关心事务的管理。Spring框架会根据注解的配置自动管理事务的开始、提交或回滚。


1. 编程式事务:

        在Spring编程式事务中,DataSourceTransactionManager和TransactionDefinition是两个核心的类:

  1. DataSourceTransactionManager: 它是基于数据源(DataSource)的事务管理器,通过获取连接并控制连接的提交或回滚来管理事务。使用时,需要配置一个数据源(DataSource),用于获取数据库连接。在事务开始时,它会从数据源中获取一个数据库连接,并将该连接绑定到当前线程上下文中。在事务结束时,它会根据事务的提交或回滚状态,来决定是否提交或回滚数据库连接。

  2. TransactionDefinition: 是Spring框架定义的事务属性接口,用于定义事务的一些属性,比如事务的隔离级别、传播行为、超时时间等。

@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@Autowiredprivate DataSourceTransactionManager transactionManager;@Autowiredprivate TransactionDefinition transactionDefinition;@RequestMapping("/del")public int del(Integer id) {if (id != null && id > 0) {// 开启事务TransactionStatus transactionStatus = null;// 业务操作,进行删除int result = 0;try {transactionStatus = transactionManager.getTransaction(transactionDefinition);result = userService.del(id);System.out.println("删除成功:" + result);transactionManager.commit(transactionStatus); // 提交} catch (Exception e) {if (transactionStatus != null) {transactionManager.rollback(transactionStatus); // 回滚}}return result;}return 0;}
}

2. 声明式事务:

        编程式事务写起来较麻烦,声明式事务用起来较方便。

        声明式事务可以通过使用 @Transactional 注解来实现:

        当方法执行完成后,如果没有发生异常,事务管理器会自动提交事务;如果发生异常,事务管理器会自动回滚事务。也可以通过在方法上抛出异常手动来触发事务的回滚。

@RestController
@RequestMapping("/user2")
public class UserController2 {@Autowiredprivate UserService userService;@Transactional@RequestMapping("del")public int del(Integer id) {if (id == null || id < 0) return 0;int ret = userService.del(id);System.out.println("删除:" + id);return ret;}
}

3. @Transactional 注解的具体使用:

3.1 作用范围: 

@Transactional注解支持修饰方法,也可以修饰类:

  • 修饰方法时:需要注意只能应用到 public 方法上,否则不生效。推荐此种用法。

  •  修饰类时:表明该注解对该类中所有的 public 方法都生效。

3.2 支持参数设置:

这些参数可以根据实际需求进行设置,如果不指定参数,则使用默认值。

  1. value:指定使用的事务管理器的名称。可以通过名称引用已经配置的事务管理器。默认值为空,表示使用默认的事务管理器。

  2. propagation:指定事务的传播行为。可以设置为以下值之一:

    • REQUIRED:如果当前没有事务,则创建一个新的事务;如果当前存在事务,则加入到当前事务中。
    • REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则将当前事务挂起。
    • NESTED:在当前事务的嵌套事务中执行。如果当前没有事务,则创建一个新的事务。
    • SUPPORTS:如果当前存在事务,则加入到当前事务中;如果当前没有事务,则以非事务方式执行。
    • MANDATORY:如果当前存在事务,则加入到当前事务中;如果当前没有事务,则抛出异常。
    • NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
    • NOT_SUPPORTED:以非事务方式执行,如果当前存在事务,则将当前事务挂起。
  3. isolation:指定事务的隔离级别。可以设置为以下值之一:

    • DEFAULT:使用默认的隔离级别(以连接的数据库隔离级别为准)。
    • READ_UNCOMMITTED:允许读取未提交的数据。
    • READ_COMMITTED:只能读取已提交的数据。
    • REPEATABLE_READ:保证可重复读取,禁止脏读和不可重复读。
    • SERIALIZABLE:保证可串行化的隔离级别,禁止脏读、不可重复读和幻读。
  4. timeout:指定事务的超时时间,单位为秒。如果事务在指定的时间内没有完成,则会被自动回滚。默认值为-1,表示没有超时限制。

  5. readOnly:指定事务是否为只读事务。如果设置为true,则表示只读事务,不允许进行任何修改操作。默认值为false。

  6. rollbackFor:指定哪些异常触发事务的回滚。可以设置为一个异常类或异常类数组。默认情况下,只有运行时异常和Error会触发事务的回滚。

  7. noRollbackFor:指定哪些异常不触发事务的回滚。可以设置为一个异常类或异常类数组。默认情况下,运行时异常和Error会触发事务的回滚。

如图: 如果要加多个参数,可以使用逗号隔开

 

使用注意事项:未检测到异常不回滚

使用 @Transactional 注解是它检测到异常才会回滚,但如果在代码中,使用 try-catch 检测到异常,并在这时程序终止了,那么事务就不会被回滚,这时非常可怕的事情。

例如:

 

解决方案1:从原因入手

        既然是 @Transactional 没有检测到异常,那我们让它检测而到就可以了,所以可以在 catch 中将异常抛出,让 @Transactional 能检测到即可

 

解决方案2:从结果入手

        在 catch 中借助 TransactionAspectSupport 的相关方法来手动回滚事务

3.3 经典面试题:

(1)@Transactional 的工作原理?

@Transactional是Spring框架中用于实现声明式事务管理的注解。它的工作原理是基于AOP(Aspect-Oriented Programming)技术。

  1. 当Spring容器启动时,会扫描所有被@Transactional注解标注的类和方法。

  2. 当调用被@Transactional注解标注的方法时,Spring会通过AOP技术在方法执行前后织入事务管理的逻辑。

  3. 在方法执行前,事务管理器会开启一个新的事务。

  4. 在方法执行过程中,如果发生异常,事务管理器会回滚事务,即撤销之前的操作。

  5. 如果方法执行成功,事务管理器会提交事务,即将之前的操作永久保存到数据库中。

  6. 如果方法执行过程中调用了其他被@Transactional注解标注的方法,事务管理器会根据事务的传播行为来决定是否将这些方法加入到当前事务中。

        需要注意的是,声明式事务只适用于公共方法,即在Spring容器中被代理的方法。如果在同一个类中的非公共方法中调用了带有@Transactional注解的公共方法,事务将不会生效。这是因为Spring使用AOP技术来实现声明式事务,只能拦截公共方法的调用。

(2)Spring 事务失效有哪些原因?

Spring事务失效的原因有以下几种可能:

1. 未正确配置事务管理器:在Spring中,需要配置事务管理器(例如DataSourceTransactionManager)来管理事务。如果未正确配置事务管理器,或者配置有误,可能导致事务失效。

2. 事务注解未生效:使用@Transactional注解来声明事务,但是注解未被正确识别和解析。可能是因为未在配置文件中启用事务注解的解析,或者注解所在的类未被Spring容器扫描到。

3. 异常未被正确抛出:事务的回滚是基于异常的,默认情况下,只有运行时异常和Error会触发事务的回滚。如果在事务方法中捕获了异常并未重新抛出,或者捕获的异常类型不符合回滚条件,事务将不会回滚。

4. 事务传播行为设置不正确:事务的传播行为决定了事务方法与其他事务方法的关系。如果事务方法的传播行为设置不正确,可能导致事务失效或不符合预期。

5. 方法未被代理:声明式事务是通过AOP技术实现的,只有被Spring容器管理的Bean中的方法才会被代理,从而实现事务的管理。如果方法未被代理,事务将不会生效。

6. 数据库不支持事务:某些数据库可能不支持事务,或者事务的隔离级别不被支持。在这种情况下,无法实现事务的管理。

7. 方法被重载:如果一个类中存在多个同名方法,但参数列表不同,而只有其中一个方法被@Transactional注解标注,那么其他同名方法的事务将不会生效。

相关文章:

Spring 事务的使用、隔离级别、@Transactional的使用

Spring事务是Spring框架提供的一种机制&#xff0c;用于管理应用程序中的数据库事务。 事务是一组数据库操作的执行单元&#xff0c;要么全部成功提交&#xff0c;要么全部失败回滚&#xff0c;保证数据的一致性和完整性。 Spring事务提供了声明式事务和编程式事务两种方式&am…...

Top命令

Top top - 12:46:01 up 2 days, 11:10, 3 users, load average: 0.56, 0.59, 0.45系统基本信息&#xff1a;显示了系统运行时间、登录用户数和平均负载&#xff08;load average&#xff09;情况。平均负载是系统在特定时间范围内的平均活跃进程数&#xff0c;可以用来衡量系…...

(三)RabbitMQ七种模式介绍与代码演示

Lison <dreamlison163.com>, v1.0.0, 2023.06.22 七种模式介绍与代码演示 文章目录 七种模式介绍与代码演示四大交换机四种交换机介绍 工作模式简单模式&#xff08;Hello World&#xff09;工作队列模式&#xff08;Work queues&#xff09;订阅模式&#xff08;Publis…...

ElasticSearch Java API 操作

1.idea创建Maven项目 2.添加依赖 修改 pom.xml 文件 <dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.8.0</version></dependency><!-- elasticsearch 的客户端 --…...

【Qt】QML-01:使用QtCreator10创建QML工程,并讲解第一个程序:Hello World

1、创建QML工程 1&#xff09;新建工程 打开QtCreator10,依次点击“Create Project” --> “Application(Qt)” --> “Qt Quick Application(compat)” 注意&#xff1a;本人打算使用Qt5.15.2创建工程&#xff0c;而非Qt6,因此选择兼容低于Qt6版本的“Qt Quick Applicat…...

Docker的安装与部署

Docker 基本概念介绍 通俗理解&#xff1a;镜像是类&#xff0c;容器是对象实例 仓库 应用商店、镜像 下载的应用安装程序、容器 应用程序 镜像(Image) 这里面保存了应用和需要的依赖环境 为什么需要多个镜像&#xff1f;当开发、构建和运行容器化应用程序时&#xff0c;我们…...

【数据结构】实验四:循环链表

实验四 循环链表 一、实验目的与要求 1&#xff09;熟悉循环链表的类型定义和基本操作&#xff1b; 2&#xff09;灵活应用循环链表解决具体应用问题。 二、实验内容 题目一&#xff1a;有n个小孩围成一圈&#xff0c;给他们从1开始依次编号&#xff0c;从编号为1的小孩开…...

【FPGA/D7】

2023年7月26日 串口传图到RAM并TFT显示 视频25note要求&#xff1a;接收两个字节数据合并为一个16位数据并写入ram&#xff1a; FIFO模型与应用场景 视频26 串口传图到RAM并TFT显示 视频25 note 存储器的使用&#xff0c;在开始读写或者结束读写的位置非常容易出现数据错误或…...

Vue的下载以及MVVM分析

&#x1f600;前言本片文章是vue系列第一篇整理了vue的基础和发展史 &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x1f609;&#x1f6…...

ElasticSearch学习--自动补全

目录 自定义分词器 介绍 配置自定义分词器 拼音分词器的问题​编辑 总结 DSL自动补全查询 RestAPI实现自动补全 自定义分词器 介绍 自定义分词器只在当前库中有效 配置自定义分词器 拼音分词器的问题 总结 DSL自动补全查询 RestAPI实现自动补全...

【C++】多态,虚函数表相关问题解决

文章目录 多态概念及其触发条件重写和协变&#xff08;考点1&#xff09;&#xff08;考点2&#xff09; 虚函数表及其位置&#xff08;考点3&#xff09; 多继承中的虚函数表 多态概念及其触发条件 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态。具体点就是去完成…...

探索大型语言模型的开源人工智能基础设施:北京开源AI Meetup回顾

原文参见Explore open source AI Infra for Large Language Models: Highlights from the Open Source AI Meetup Beijing | Cloud Native Computing Foundation 背景介绍&#xff1a; 最近&#xff0c;在 ChatGPT 的成功推动下&#xff0c;大型语言模型及其应用程序的流行度激…...

Langchain 的 Conversation buffer window memory

Langchain 的 Conversation buffer window memory ConversationBufferWindowMemory 保存一段时间内对话交互的列表。它仅使用最后 K 个交互。这对于保持最近交互的滑动窗口非常有用&#xff0c;因此缓冲区不会变得太大。 我们首先来探讨一下这种存储器的基本功能。 示例代码&…...

电流源电路

3.3.3电流源电路 镜像电流源 电路 分析 仿真 比例电流源 电路 分析 仿真 加射极输出器的电流源1 电路 分析 仿真 加射极输出器的电流源2 电路 分析 仿真 威尔逊电流源 电路 分析 仿真...

iOS开发-CMMotionManager传感器陀螺仪

iOS开发-CMMotionManager传感器陀螺仪 之前开发中遇到需要使用陀螺仪判断是否拍照时候水平判断&#xff0c;如果没有水平拍照&#xff0c;则给出提示。方便用户拍照合适的题目图片。 一、CMMotionManager CMMotionManager是什么 CMMotionManager 是 Core Motion 库的核心类&…...

影刀下载,插件安装

1、下载 在影刀官网下载&#xff1a;www.yingdao.com 2、谷歌插件安装 参考&#xff1a; 影刀插件安装各种方式 浏览器安装插件说明 - 影刀帮助中心 安装说明&#xff1a;驱动外置 Chrome 需要安装插件&#xff0c;并且保证此插件处于开启状态 方式一&#xff1a;用户头…...

Linux的tcpdump命令详解

tcpdump 一款sniffer工具&#xff0c;是Linux上的抓包工具&#xff0c;嗅探器 补充说明 tcpdump命令 是一款抓包&#xff0c;嗅探器工具&#xff0c;它可以打印所有经过网络接口的数据包的头信息&#xff0c;也可以使用-w选项将数据包保存到文件中&#xff0c;方便以后分析。…...

springboot运行报错Failed to load ApplicationContext for xxx

Failed to load ApplicationContext for报错解决方法 报错Failed to load ApplicationContext for 报错Failed to load ApplicationContext for 网上找了一堆方法都尝试了还是没用 包括添加mapperScan&#xff0c;添加配置类 配置pom文件 [外链图片转存失败,源站可能有防盗链机…...

[SQL挖掘机] - 内连接: inner join

介绍: 内连接是一种多表连接方式&#xff0c;用于将两个或多个表中的数据通过共同的列值进行匹配&#xff0c;并返回满足连接条件的匹配行。简单来说&#xff0c;内连接能够将相关联的数据组合在一起&#xff0c;以便进行更复杂和全面的数据分析。 内连接的工作原理如下&…...

mysql(四)数据备份

目录 前言 一、概述 二、备份的类型 &#xff08;一&#xff09;物理与逻辑角度 &#xff08;二&#xff09;数据库备份策略角度 三、常见的备份方法 四、完整备份 &#xff08;一&#xff09;打包数据库文件备份 &#xff08;二&#xff09;备份工具备份 五、增量备份 六、操…...

别只盯着时钟了!用Vivado的Set_Data_Check搞定FPGA里两个数据信号的时序检查(附工程源码)

FPGA时序约束进阶&#xff1a;用Set_Data_Check精准控制数据信号时序关系 在FPGA设计中&#xff0c;时序约束是确保电路功能正确性的关键环节。大多数工程师对时钟与数据信号之间的setup/hold约束已经驾轻就熟&#xff0c;但当面对两个数据信号之间的时序关系时&#xff0c;却常…...

Graphormer在计算毒理学中的应用:预测hERG通道抑制活性的完整建模流程

Graphormer在计算毒理学中的应用&#xff1a;预测hERG通道抑制活性的完整建模流程 1. 项目概述 Graphormer是一种基于纯Transformer架构的图神经网络&#xff0c;专门为分子图&#xff08;原子-键结构&#xff09;的全局结构建模与属性预测而设计。该模型在OGB、PCQM4M等分子…...

Node.js后端服务开发:搭建调用Lingbot-Depth-Pretrain-ViTL-14的API接口

Node.js后端服务开发&#xff1a;搭建调用Lingbot-Depth-Pretrain-ViTL-14的API接口 你是不是遇到过这样的场景&#xff1a;手头有一个很厉害的AI模型&#xff0c;比如能估算图片深度的Lingbot-Depth-Pretrain-ViTL-14&#xff0c;但不知道怎么把它变成一个方便调用的服务&…...

3PEAK思瑞浦 TPT1051V-SO1R SOP8 CAN收发器

特性 符合IS011898标准支持CAN FD和最高达5 Mbps的数据速率典型环路延迟:110纳秒5V电源供应&#xff0c;3.0V~5.5VI0接口接收器共模输入电压:士30V总线故障保护:42VCAN网络最多支持110个节点结温范围从-40C到150C闩锁性能超过500mA总线引脚ESD保护:-8kV人体模型 -1.5kV充电设备…...

Dism++深度解析:Windows系统管理与优化专业指南

Dism深度解析&#xff1a;Windows系统管理与优化专业指南 【免费下载链接】Dism-Multi-language Dism Multi-language Support & BUG Report 项目地址: https://gitcode.com/gh_mirrors/di/Dism-Multi-language Dism作为一款功能强大的开源Windows系统管理工具&…...

万象视界灵坛惊艳效果展示:同一张宠物图在‘金毛犬’‘幼犬’‘户外玩耍’‘毛发蓬松’多维排序

万象视界灵坛惊艳效果展示&#xff1a;同一张宠物图在"金毛犬""幼犬""户外玩耍""毛发蓬松"多维排序 1. 效果展示开场 今天我要向大家展示万象视界灵坛这个神奇工具的实际效果。它就像一个视觉魔法师&#xff0c;能够深入理解图片中的…...

从数学直觉到代码实践:Harris角点检测的算法拆解与性能调优

1. 角点检测&#xff1a;计算机视觉的基石 想象一下你正在玩一个拼图游戏。当两块拼图能够严丝合缝地拼接在一起时&#xff0c;往往是因为它们在某些关键位置完美匹配——这些位置通常是拼图块的拐角处。计算机视觉中的角点检测&#xff0c;本质上就是在做类似的事情&#xff1…...

亿级并发下的抢票系统架构:从DDD到微服务的实战解析

1. 抢票系统的业务挑战与技术痛点 每年春运期间&#xff0c;12306系统都要面对全球最严苛的高并发考验。2019年春运最高峰日点击量达到1495亿次&#xff0c;相当于每个中国人当天点击了100多次。这种量级的并发请求&#xff0c;如果直接打到数据库上&#xff0c;就算是把阿里云…...

跨设备追番终极指南:3步配置Kazumi WebDAV数据同步

跨设备追番终极指南&#xff1a;3步配置Kazumi WebDAV数据同步 【免费下载链接】Kazumi 基于自定义规则的番剧采集APP&#xff0c;支持流媒体在线观看&#xff0c;支持弹幕&#xff0c;支持实时超分辨率。 项目地址: https://gitcode.com/gh_mirrors/ka/Kazumi 还在为手…...

RSA2 - Writeup by AI

RSA2 - Writeup by AI 题目信息项目内容题目来源Bugku CTF题目类型Crypto (密码学)考点RSA 小指数攻击、Rabin 加密题目描述 给定 RSA 加密参数&#xff1a; 加密指数 e 2模数 N&#xff08;3072 位&#xff09;密文 c 要求解密得到 flag。 考点分析 核心知识点 RSA 小指数攻击…...