【Spring】深入理解 Spring 事务管理

文章目录

  • 一、事务的基本概念​
      • 原子性(Atomicity)
      • 一致性(Consistency)
      • 隔离性(Isolation)
      • 持久性(Durability)
  • 二、Spring 事务管理的优势​
      • 简化事务管理代码
      • 提供多种事务管理方式
      • 整合多种持久化技术
  • 三、Spring 事务管理的核心接口​
      • PlatformTransactionManager
      • TransactionDefinition
      • TransactionStatus
  • 四、事务传播行为​
  • 五、事务隔离级别​
  • 六、声明式事务管理​
  • 七、事务的回滚规则​
  • 八、事务失效场景​

在当今的企业级应用开发中,数据的一致性和完整性是至关重要的。而 Spring 框架提供的事务管理功能,为我们解决这一关键问题提供了强大的支持。本文将深入探讨 Spring 事务管理的相关知识,帮助大家更好地理解和运用它。​

一、事务的基本概念​

事务是一组逻辑操作单元,这些操作要么全部成功,要么全部失败。例如在银行转账场景中,从账户 A 向账户 B 转账 100 元,涉及到从账户 A 扣款 100 元和向账户 B 存款 100 元两个操作,这两个操作必须作为一个整体来执行,要么都成功,否则就会导致数据不一致。事务具有 ACID 特性:​

原子性(Atomicity)

事务中的所有操作要么全部执行成功,要么全部失败回滚,就像一个原子一样不可分割。​

一致性(Consistency)

事务执行前后,数据库的完整性约束没有被破坏,数据从一个一致性状态转换到另一个一致性状态。​

隔离性(Isolation)

多个事务并发执行时,一个事务的执行不能被其他事务干扰,各个事务之间相互隔离。​

持久性(Durability)

一旦事务提交成功,对数据库所做的修改就会永久保存下来,即使系统发生故障也不会丢失。​

二、Spring 事务管理的优势​

简化事务管理代码

传统的 JDBC 事务管理需要编写大量的样板代码来处理事务的开始、提交、回滚等操作,而 Spring 通过声明式事务管理,让我们可以通过简单的配置或注解来管理事务,大大减少了代码量。​

提供多种事务管理方式

Spring 支持编程式事务管理和声明式事务管理。编程式事务管理通过编写代码来控制事务,灵活性较高;声明式事务管理则通过配置或注解来指定事务的边界和属性,更符合面向切面编程(AOP)的思想,便于维护和管理。​

整合多种持久化技术

Spring 事务管理可以与多种持久化技术如 JDBC、Hibernate、JPA 等无缝集成,无论你使用哪种持久化技术,都能方便地进行事务管理。​

三、Spring 事务管理的核心接口​

PlatformTransactionManager

这是 Spring 事务管理的核心接口,它提供了事务管理的基本方法,如获取事务、提交事务、回滚事务等。不同的持久化技术对应不同的实现类,例如对于 JDBC,有 DataSourceTransactionManager;对于 Hibernate,有 HibernateTransactionManager 等。​

TransactionDefinition

该接口定义了事务的属性,包括事务的传播行为、隔离级别、超时时间、是否只读等。通过设置这些属性,可以灵活地控制事务的行为。​

TransactionStatus

代表一个事务的状态,通过它可以获取事务的相关信息,如是否新事务、是否已完成等,还可以手动回滚事务。​

四、事务传播行为​

事务传播行为定义了一个事务方法被另一个事务方法调用时,事务应该如何传播。Spring 定义了 7 种事务传播行为:​
PROPAGATION_REQUIRED(默认):如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新事务。例如方法 A 调用方法 B,若方法 A 已经在一个事务中,方法 B 会加入方法 A 的事务;若方法 A 没有事务,方法 B 会创建一个新事务。​
PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。​
PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。​
PROPAGATION_REQUIRES_NEW:总是创建一个新事务。如果当前存在事务,则将当前事务挂起,直到新事务执行完毕。​
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作。如果当前存在事务,则将当前事务挂起。​
PROPAGATION_NEVER:以非事务方式执行操作。如果当前存在事务,则抛出异常。​
PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则创建一个新事务。嵌套事务可以独立于外部事务进行回滚或提交,但外部事务回滚时,嵌套事务也会回滚。​

五、事务隔离级别​

事务隔离级别用于解决多个事务并发执行时可能出现的问题,如脏读、不可重复读、幻读等。Spring 支持以下 5 种事务隔离级别:​
ISOLATION_DEFAULT:使用底层数据库默认的隔离级别。​
ISOLATION_READ_UNCOMMITTED:最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、不可重复读和幻读。​
ISOLATION_READ_COMMITTED:允许读取并发事务已经提交的数据,避免了脏读,但可能会出现不可重复读和幻读。​
ISOLATION_REPEATABLE_READ:对同一字段的多次读取结果是一致的,除非数据被当前事务本身修改,避免了脏读和不可重复读,但可能会出现幻读。​
ISOLATION_SERIALIZABLE:最高的隔离级别,完全串行化的事务,避免了脏读、不可重复读和幻读,但性能开销较大。​

六、声明式事务管理​

声明式事务管理是 Spring 推荐的事务管理方式,它基于 AOP 实现。在 Spring 中,可以通过 XML 配置或注解来实现声明式事务管理。

@Servicepublic class OrderService {@Autowiredprivate OrderDao orderDao;​
​@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)public void placeOrder(Order order) {​orderDao.save(order);}}

在@Transactional注解中可以指定事务的传播行为、隔离级别等属性。

七、事务的回滚规则​

默认情况下,Spring 事务在遇到运行时异常(RuntimeException 及其子类)和错误(Error)时会自动回滚事务,而遇到受检异常(Checked Exception)时不会自动回滚事务。但我们可以通过@Transactional注解的rollbackFor和noRollbackFor属性来指定回滚规则。​
1. rollbackFor:指定需要回滚事务的异常类型,例如:

@Transactional(rollbackFor = CustomBusinessException.class)public void businessMethod() {// 业务逻辑​
}

这里指定了遇到CustomBusinessException异常时回滚事务。​
2. noRollbackFor:指定不需要回滚事务的异常类型,例如:

@Transactional(noRollbackFor = DataAccessException.class)public void dataAccessMethod() {// 数据访问逻辑​
}

这里表示遇到DataAccessException异常时不回滚事务。

八、事务失效场景​

1. 方法内部调用:当一个类中的非事务方法调用同一类中的事务方法时,事务会失效。因为 Spring 的声明式事务是基于 AOP 代理实现的,在类内部方法调用时,并不会经过代理对象,事务增强逻辑也就不会生效。例如:

@Servicepublic class UserService {@Autowiredprivate UserDao userDao;​
​public void nonTransactionalMethod() {// 内部调用事务方法​transactionalMethod();}​
​@Transactionalpublic void transactionalMethod() {​userDao.save(new User());}}

在上述代码中,nonTransactionalMethod内部调用transactionalMethod,此时transactionalMethod上的事务不会生效。解决办法是将调用逻辑抽取到另一个被 Spring 管理的服务类中,通过依赖注入进行调用。​
2. 未被 Spring 管理的类:如果一个类没有被 Spring 容器管理,那么它上面的@Transactional注解不会生效。比如,在一个普通的 Java 类中使用@Transactional,事务不会起作用。确保所有需要事务管理的类都通过@Component、@Service、@Repository等注解交由 Spring 管理。​
3. 不支持事务的数据源:若使用的数据源本身不支持事务,如某些轻量级的嵌入式数据库默认不开启事务支持,那么即使配置了 Spring 事务管理,事务也无法正常工作。需要检查并确保所使用的数据源具备事务处理能力,并且正确配置了事务相关参数。​
4. 异常被捕获处理:当事务方法内部捕获了异常,却没有重新抛出运行时异常或错误,事务不会回滚。例如:

@Transactionalpublic void saveUser(User user) {try {​userDao.save(user);int i = 1 / 0; // 模拟异常​} catch (Exception e) {// 捕获异常但未抛出运行时异常​log.error("操作出错", e);}}

在这种情况下,事务不会回滚。正确做法是在捕获异常后,根据业务逻辑决定是否重新抛出运行时异常,如throw new RuntimeException(e)。​
5. 错误的事务传播机制设置:在使用事务传播行为时,如果设置不当,也可能导致事务失效。例如,将一个方法的事务传播行为设置为PROPAGATION_NOT_SUPPORTED,那么该方法内的事务操作实际上是在无事务环境下执行的。需要根据业务场景合理选择事务传播行为。​
6. 多线程调用:在多线程环境下,Spring 的事务管理基于线程绑定来工作。如果在一个线程中开启事务,然后在另一个线程中执行事务相关操作,事务上下文无法传递,导致事务失效。要避免在多线程场景下直接使用 Spring 事务管理,可考虑使用支持分布式事务的解决方案,如 Seata 等。

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

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

相关文章

Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听(断网/网络恢复事件监听)

Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听(断网/网络恢复事件监听) 目录 Flutter 学习之旅 之 flutter 使用 connectivity_plus 进行网路状态监听(断网/网络恢复事件监听) 一、简单介绍 二、conne…

matlab的meshgrid

文章目录 一、什么是 meshgrid?二、基本语法三、为什么需要 meshgrid?四、meshgrid 与 ndgrid 的区别 一、什么是 meshgrid? meshgrid 是 MATLAB 中用于生成网格点坐标矩阵的函数,常用于三维绘图(如 surf, mesh, cont…

word插入Mathtype公式居中和自动更新

word插入公式自动更新 前提:安装Mathtype 1.word中查看页的宽度 出现如下 2.设置样式 出现这个窗口 给样式随便起个名字 3.修改样式 3.1 设置两个制表位 第二个 3.2 修改公式字体 如下所示 4. 修改公式格式 4.1在word中打开 Mathtype 4.2 修改公式的格式 变成…

用 pytorch 从零开始创建大语言模型(六):对分类进行微调

用 pytorch 从零开始创建大语言模型(六):对分类进行微调 6 微调用于分类6.1 微调的不同类别6.2 准备数据集6.3 创建数据加载器6.4 使用预训练权重初始化模型6.5 添加分类头部6.6 计算分类损失和准确率6.7 在监督数据上微调模型6.8 使用LLM进…

阿里云对象存储教程

搜“对象存储->免费试用” 选择你的心仪产品,我使用的是第一个 创建后获得三个实例: 点击右上角自己的账号可以进入到AccessKey管理界面 回到对象存储控制台创建Bucket实例 在以下文件中替换自己Bucket的信息即可美美使用~ package com.kitty.blog…

基于Python的智慧金融风控系统的设计与实现

指导途径(🛰):NzqDssm16 1立题依据 1.1毕业论文(设计)的研究背景 随着金融行业数字化转型加速,智能风控系统成为防范金融风险的核心支撑。传统风控手段存在数据处理效率低下、模型更新滞后、人…

分布式算法:Paxos Raft 两种共识算法

1. Paxos算法 Paxos算法是 Leslie Lamport(莱斯利兰伯特)在 1990 年提出的一种分布式系统共识算法。也是第一个被证明完备的共识算法(前提是不存在恶意节点)。 1.1 简介 Paxos算法是第一个被证明完备的分布式系统共识算法。共识…

Day20-前端Web案例——部门管理

目录 部门管理1. 前后端分离开发2. 准备工作2.1 创建Vue项目2.2 安装依赖2.3 精简项目 3. 页面布局3.1 介绍3.2 整体布局3.3 左侧菜单 4. Vue Router4.1 介绍4.2 入门4.3 案例4.4 首页制作 5. 部门管理5.1部门列表5.1.1. 基本布局5.1.2 加载数据5.1.3 程序优化 5.2 新增部门5.3…

信创-人大金仓数据库创建

一. 官文 资源下载地址 https://download.kingbase.com.cn/xzzx/index.htm 下载安装文件 下载授权文件 产品文档地址:https://help.kingbase.com.cn/v8/index.html 二. 概念 2.1 体系结构 ‌ 实例结构 ‌:由数据库文件和 KingbaseES 实例组成。数据…

[ACTF2020 新生赛]BackupFile-3.23BUUCTF练习day5(1)

[ACTF2020 新生赛]BackupFile-3.23BUUCTF练习day5(1) 解题过程 打开题目环境 看题目意思应该是让我找备份文件 备份文件一般的后缀名为 .rar .zip .7z .tar.gz .bak .swp .txt .html .bak 直接扫描一下 在url中输入/index.php.bak 弱类型比较 为弱相等,即当…

【嵌入式Linux】基于ArmLinux的智能垃圾分类系统项目

目录 1. 功能需求2. Python基础2.1 特点2.2 Python基础知识2.3 dict嵌套简单说明 3. C语言调用Python3.1 搭建编译环境3.2 直接调用python语句3.3 调用无参python函数3.4 调用有参python函数 4. 阿里云垃圾识别方案4.1 接入阿里云4.2 C语言调用阿里云Python接口 5. 香橙派使用摄…

css的背景

css背景属性,可以给页面元素添加背景样式。 一.背景颜色 二.背景图片 语法 backgroud-image :none || url(图像地址) 三.背景平铺 既可以添加背景颜色也可以添加背景图片,只不过背景图片会压住背景颜色 四.背景位置 1.方位名词 如果只指定…

macOS Sequoia 15.3 一直弹出“xx正在访问你的屏幕”

🙅 问题描述 macOS 系统升级后(15.2或者15.3均出现过此问题),不管是截图还是开腾讯会议,只要跟捕捉屏幕有关,都一直弹出这个选项,而且所有软件我都允许访问屏幕了,这个不是询问是否…

高德终端技术总结:高可用架构如何练成?

前言 高德地图作为国民级应用,特别是出行场景的独特性,要确保在线导航高并发和交通安全级的超稳定性,这对技术团队提出异乎寻常的高要求,无论是终端、云端,还是“终端-云端”之间的连接,都必须实现“高可用…

UDP套接字编程(代码)

什么是socket套接字编程? 通过Ip地址 端口号这种方式定位一台主机,这样的方式我们就叫做socket套接字。 Udp Socket 接口介绍 这些案列我们使用的接口基本都是一样的,所以在这里我先把接口介绍完,具体的细节后面在说明。 创…

C# 调用 VITS,推理模型 将文字转wav音频net8.0 跨平台

一、系统环境 操作系统:win10,win11 运行环境:dotnet8 工具:命令行,powershell 开源库:sherpa-onnx 二、工具和源码下载 开源库:https://k2-fsa.github.io/sherpa/onnx/index.html 运行环境下载 https://dotnet.microsoft.c…

【AI学习笔记】Coze平台实现将Excel文档批量导入数据库全过程

背景前摇&原视频教程: 最近看到很多同学都在用Coze平台操作数据,我也想了解一下工作流的搭建和数据处理过程,但是一下子又看不懂太复杂的逻辑,于是上B站搜索相关的基础教程。 Coze官方教程: 之前有看过Coze平台…

Certd自动化申请和部署SSL证书并配置https

服务器使用的华为云,之前SSL证书通过配置Cloudflare的DNS实现的,最近华为云备案提示需修改解析至境内华为云IP,若解析境外IP,域名无需备案,需注销或取消接入备案信息,改为使用Certd自搭建证书管理工具&…

AI基础01-文本数据采集

本篇文章是学习文本数据的采集,作为人工智能训练师或者数据分析师有时需要先获取数据,然后进行数据清洗、数据标注。很明显数据采集是后续步骤的基础。 1)数据采集定义 数据采集:data acquisition,DAQ 又称为数据获取…

生活电子常识-deepseek-r1本地化部署+ui界面搭建

前言 deepseek-r1 14b模型,32b模型部署在本地电脑上也能实现非常好的性能。 因此有兴趣研究了下如何在本地部署。 同时最新流行mauns工作流,他们提供一句话实现网页端任意应用的能力。实际上,你也可以用本地的模型来实现离线的ai工作流功能。…