深入了解 Spring boot的事务管理机制:掌握 Spring 事务的几种传播行为、隔离级别和回滚机制,理解 AOP 在事务管理中的应用

963034f17590412b808770f619144970.png

🎉🎉欢迎光临,终于等到你啦🎉🎉

🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀

🌟持续更新的专栏《Spring 狂野之旅:从入门到入魔》 🚀

本专栏带你从Spring入门到入魔 

这是苏泽的个人主页可以看到我其他的内容哦👇👇

努力的苏泽http://suzee.blog.csdn.net/

 


 

目录

介绍

1.1 Spring 事务管理的重要性

1.2 目标和范围

Spring 事务基础

2.1 事务概述

2.2 事务管理器

2.3 事务定义和注解

事务角色

事务相关配置

事务传播行为

1. REQUIRED 传播行为

2. REQUIRES_NEW 传播行为

3. SUPPORTS 传播行为

4. NOT_SUPPORTED 传播行为

5. MANDATORY 传播行为

6. NEVER 传播行为

​编辑

隔离级别

1. READ_UNCOMMITTED 隔离级别

2. READ_COMMITTED 隔离级别

3. REPEATABLE_READ 隔离级别

4. SERIALIZABLE 隔离级别

事务原理

aop/动态代理

事务管理

对于编程式事务管理:

对于声明式事务管理:

实例

TransactionInterceptor 事务拦截处理


 

 

 

d0464b6237e94b0a9210f632325218c6.png

介绍

1.1 Spring 事务管理的重要性

在应用程序中,事务管理是确保数据的一致性和完整性的重要组成部分。Spring 事务管理提供了一种可靠且灵活的方式来管理事务,确保在数据库操作过程中的原子性、一致性、隔离性和持久性。

Spring 事务管理的重要性包括:

  • 数据库一致性:通过事务管理,可以确保数据库操作的原子性,即要么所有操作都成功提交,要么全部回滚,从而保持数据的一致性。
  • 错误处理和回滚:事务管理使得在发生错误时能够回滚事务,确保数据的完整性,以及在异常情况下进行适当的错误处理。
  • 并发控制:通过定义适当的隔离级别,事务管理可以处理并发访问数据库的问题,避免数据冲突和不一致性。
  • 扩展性和灵活性:Spring 事务管理提供了多种配置选项和编程方式,可以根据应用程序的需求进行灵活配置和管理。

1.2 目标和范围

Spring 事务管理的目标是确保在应用程序中的数据库操作过程中,能够实现以下目标:

  • 原子性(Atomicity):事务中的所有操作要么全部成功执行并提交,要么全部失败并回滚,确保数据库的一致性。
  • 一致性(Consistency):事务的执行过程中,数据库从一个一致的状态转变为另一个一致的状态,不会破坏数据的完整性。
  • 隔离性(Isolation):多个并发事务之间应该相互隔离,每个事务的操作应该看起来像是在独立执行,避免数据冲突和不一致性。
  • 持久性(Durability):一旦事务提交,其对数据库的修改应该是永久性的,即使在系统故障或重启后也能够恢复。

Spring 事务管理的范围包括:

  • 支持多种事务管理方式:Spring 提供了多种事务管理方式,包括编程式事务管理和声明式事务管理,以适应不同的应用场景和开发需求。
  • 集成多种事务管理器:Spring 可以与各种事务管理器集成,包括本地 JDBC 事务、JTA 分布式事务、Hibernate 事务等,以便与不同的持久化框架和数据库进行交互。
  • 提供注解和 XML 配置支持:Spring 允许使用注解或 XML 配置的方式来定义和管理事务,使得事务管理更加灵活和便捷。

Spring 事务基础

2.1 事务概述

Spring 事务是一组数据库操作的逻辑单元,具有原子性和一致性。事务由一系列操作组成,这些操作要么全部成功执行并提交,要么全部失败并回滚。

Spring 事务的关键概念包括:

  • 事务管理器(Transaction Manager):事务管理器是 Spring 提供的一个接口,用于管理事务的开始、提交和回滚操作。它与底层的数据库或持久化框架进行交互,并确保事务的正确执行。
  • 事务定义(Transaction Definition):事务定义定义了事务的属性,如隔离级别、传播行为、超时设置等。它可以通过编程方式或声明式方式来定义。
  • 事务状态(Transaction Status):事务状态表示当前事务的状态,包括已提交、已回滚或进行中等。通过事务状态,可以对事务进行管理和控制。
  • 事务切面(Transaction Aspect):事务切面是应用程序中与事务相关的逻辑和功能的集合。它可以通过编程方式或声明式方式来定义和应用。

2.2 事务管理器

在 Spring 中,事务管理器(Transaction Manager)是用于管理事务的关键组件。事务管理器负责事务的开始、提交和回滚操作,并与底层的数据库或持久化框架进行交互。

Spring 提供了多种事务管理器的实现,包括:

  • DataSourceTransactionManager:用于管理基于 JDBC 的事务,与 JDBC DataSource 进行交互。
  • JpaTransactionManager:用于管理基于 JPA(Java Persistence API)的事务,与 JPA EntityManagerFactory 进行交互。
  • HibernateTransactionManager:用于管理基于 Hibernate 的事务,与 Hibernate SessionFactory 进行交互。
  • JtaTransactionManager:用于管理分布式事务,与 JTA(Java Transaction API)进行交互。

你可以根据应用程序所使用的持久化框架选择合适的事务管理器。

2.3 事务定义和注解

在 Spring 中,事务定义(Transaction Definition)用于定义事务的属性,如隔离级别、传播行为、超时设置等。事务定义可以通过编程方式或声明式方式来定义。

编程式事务定义是通过编写代码来显式地管理事务的开始、提交和回滚。你可以使用编程式事务管理的 API(如 TransactionTemplate)来定义事务的属性。

声明式事务定义是通过在方法或类级别上使用注解或 XML 配置来定义事务的属性。Spring 提供了 @Transactional 注解,用于在方法级别上定义事务的属性。你可以在需要进行事务管理的方法上添加 @Transactional 注解,并指定事务的属性。

事务的属性包括传播行为(Propagation)、隔离级别(Isolation)、只读标志(ReadOnly)、超时设置(Timeout)等。通过定义适当的事务属性,你可以控制事务的行为和特性。

例如,下面是一个使用 @Transactional 注解定义事务的例子:

@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
public void performTransaction() {// 事务操作
}

事务角色

e36f40795cd34803a141d0149cef5b88.png

 

d3e9cdff426246fda0e4d8135e3e3f66.png

事务相关配置

0f200c92b8d04c439a5eb80159c968dd.png

 

事务传播行为

1. REQUIRED 传播行为

  • 如果当前存在事务,则加入该事务中执行。
  • 如果当前没有事务,则创建一个新的事务执行。
  • 这是Spring默认的传播行为。

2. REQUIRES_NEW 传播行为

  • 总是创建一个新的事务,并挂起当前事务(如果存在)。
  • 在新的事务中执行方法,不受外部事务的影响。

3. SUPPORTS 传播行为

  • 如果当前存在事务,则加入该事务中执行。
  • 如果当前没有事务,则以非事务的方式执行。

4. NOT_SUPPORTED 传播行为

  • 总是以非事务的方式执行方法。
  • 如果当前存在事务,则将其挂起。

5. MANDATORY 传播行为

  • 如果当前存在事务,则加入该事务中执行。
  • 如果当前没有事务,则抛出异常。

6. NEVER 传播行为

  • 总是以非事务的方式执行方法。
  • 如果当前存在事务,则抛出异常。

e1788f2dc372458da5ccc9a553a6a9b8.png

 832a99a3239f47bbb2e16138ca06af85.png

 

 

隔离级别

1. READ_UNCOMMITTED 隔离级别

  • 最低的隔离级别,允许脏读、不可重复读和幻读的发生。
  • 一个事务可以读取另一个事务未提交的数据。

2. READ_COMMITTED 隔离级别

  • 保证一个事务修改的数据提交后才能被另一个事务读取。
  • 避免脏读的发生,但仍可能出现不可重复读和幻读。

3. REPEATABLE_READ 隔离级别

  • 保证一个事务不能读取另一个事务未提交的数据。
  • 避免脏读和不可重复读的发生,但仍可能出现幻读。

4. SERIALIZABLE 隔离级别

  • 最高的隔离级别,保证所有情况下都不会发生脏读、不可重复读和幻读。
  • 事务被处理为顺序执行,避免并发读写操作。

ae1c3b8ddbe1497090e04ee82f14532a.png

 

事务原理

aop/动态代理

Spring的事务抽象包括三个主要接口:PlatformTransactionManager、TransactionDefinition和TransactionStatus。

  • PlatformTransactionManager负责定义事务的边界,它确定了何时开始和结束一个事务。
  • TransactionDefinition负责定义事务的属性,包括隔离级别、传播行为等。它提供了对事务进行详细配置的能力。
     
  • PlatformTransactionManager根据TransactionDefinition的属性定义来开启相关的事务。在事务开始后到结束期间,TransactionStatus负责跟踪和管理事务的状态。通过TransactionStatus,我们可以对事务进行有限的控制。
     
  • 常用的TransactionDefinition的实现包括DefaultTransactionDefinition和TransactionTemplate。这两个主要用于编程式事务场景。另外,还有DefaultTransactionAttribute和RuleBasedTransactionAttribute,它们主要用于基于Spring AOP的声明式事务管理场景。RuleBasedTransactionAttribute允许同时指定多个回滚规则。
     
  • TransactionStatus的一个常见实现是DefaultTransactionStatus,它用于记录事务的状态信息。
  • PlatformTransactionManager的实现可以分为面向局部事务和面向全局事务两个分支。常用的面向局部事务的实现包括DataSourceTransactionManager(用于JDBC和MyBatis)和HibernateTransactionManager。它们提供了针对特定持久化框架的事务管理功能。

6ce87c644e4546a79469c312e014ecc4.png

 

035dd59c8c9f4290882eb7da28f91778.png

 

事务管理

对于编程式事务管理:

  1. 使用TransactionTemplate或直接使用底层的PlatformTransactionManager进行操作。
  2. 需要在代码中显式地编写事务管理的逻辑。
  3. 需要手动处理事务的开始、提交和回滚。
  4. 事务的管理逻辑与业务逻辑紧密耦合,导致代码的可读性和可维护性降低。
  5. 可以在更细粒度的代码块级别实现事务管理。

对于声明式事务管理:

  1. 建立在AOP(面向切面编程)之上,通过拦截目标方法前后的执行来实现事务管理。
  2. 通过配置文件或基于@Transactional注解的方式声明事务规则。
  3. 不需要在业务逻辑代码中编写事务管理的代码,保持业务代码的纯粹性。
  4. 事务的管理逻辑与业务逻辑解耦,提高了代码的可读性和可维护性。
  5. 最细粒度只能作用于方法级别,无法直接作用于代码块级别,但可以通过方法的粒度来实现类似的效果。

 

 

实例

假设我们有一个银行账户系统,其中涉及两个账户之间的转账操作,需要保证转账操作的原子性,即要么两个账户的金额同时发生变化,要么都不发生变化。

首先,我们需要使用数据库事务来确保转账操作的一致性。假设我们使用Spring框架来管理事务,代码如下所示:

@Transactional
public void transferAmount(String fromAccount, String toAccount, double amount) {try {// 1. 查询转出账户的余额double fromBalance = accountDao.getBalance(fromAccount);// 2. 查询转入账户的余额double toBalance = accountDao.getBalance(toAccount);// 3. 判断转出账户余额是否足够if (fromBalance < amount) {throw new InsufficientBalanceException("Insufficient balance in the source account.");}// 4. 扣除转出账户的金额accountDao.updateBalance(fromAccount, fromBalance - amount);// 5. 增加转入账户的金额accountDao.updateBalance(toAccount, toBalance + amount);// 6. 提交事务} catch (Exception e) {// 7. 出现异常,回滚事务throw new TransferException("Error occurred during the transfer.", e);}
}

我们使用@Transactional注解表示该方法需要在事务中执行。在方法内部,我们按照以下步骤进行转账操作:

  1. 查询转出账户的余额。
  2. 查询转入账户的余额。
  3. 判断转出账户余额是否足够,如果不足够,则抛出异常。
  4. 扣除转出账户的金额。
  5. 增加转入账户的金额。

在第6步之前,如果发生了异常,会跳转到第7步,即异常处理的代码块。在异常处理块中,我们抛出一个自定义的TransferException,并使用throw语句将异常继续抛出。这会触发Spring事务管理器的回滚机制,导致之前的数据库操作被撤销,从而恢复到事务开始之前的状态。

通过事务回滚机制,如果在转账过程中发生异常,例如转出账户余额不足,所有的数据库操作都会被回滚,确保数据的一致性。这样可以避免转账过程中数据发生不一致的情况。

TransactionInterceptor 事务拦截处理

通过 Pointcut 事务切点筛选出来的 Bean,会创建一个代理对象,Bean 内部肯定定义了 @Transactional 注解,如果是类上定义的 @Transactional 注解,每个方法都需要进行事务处理。代理对象的事务拦截处理在 TransactionInterceptor 拦截器中,实现了 MethodInterceptor 方法拦截器,也就是实现了 Object invoke(MethodInvocation invocation) 这个方法,一起来看看 TransactionInterceptor 这个类

8e44f9e7b65644a5871525095bcaab30.png

 

 

 

 

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

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

相关文章

LeetCode 热题 100 | 堆(一)

目录 1 什么是堆排序 1.1 什么是堆 1.2 如何构建堆 1.3 举例说明 2 215. 数组中的第 K 个最大元素 2.1 子树大根化 2.2 遍历所有子树 2.3 弹出栈顶元素 2.4 完整代码 菜鸟做题&#xff0c;语言是 C 1 什么是堆排序 1.1 什么是堆 堆的定义和分类&#xff…

【c++入门】命名空间,缺省参数与函数重载

&#x1f525;个人主页&#xff1a; Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好&#xff01;本篇内容我们进入一个新的阶段&#xff0c;进入c的学习&#xff01;希望我的博客内容能对你有帮助&#xff01; 目录 1.c关键字2.第一个c代码3.命名空间3.1 nam…

CTF-辨别细菌

题目描述&#xff1a;try your best to find the flag. 进入靶场后发现是一个游戏&#xff0c;需要全部答对才可以得到最后的flag 查看了一下源码&#xff0c;发现有一个答案模板的模块 尝试解释一下代码 <!-- 答案模版 --> <script id"template_game_pi…

数据结构/C++:红黑树

数据结构/C&#xff1a;红黑树 概念实现基本结构插入uncle为红色节点uncle为黑色节点 总代码展示 概念 红黑树是一种二叉搜索树&#xff0c;一般的二叉搜索会发生不平衡现象&#xff0c;导致搜索效率下降&#xff0c;于是学者们开始探索如何让二叉搜索树保持平衡&#xff0c;这…

Agent驱动的RPA——实在Agent(智能体):自动化时代的新引擎

随着人工智能和机器学习技术的快速发展&#xff0c;智能Agent在 RPA领域扮演了革命性的角色。 Agent驱动的RPA不仅实现了传统规则导向自动化工具的功能升级&#xff0c;而且通过引入自主、智能决策与协作能力&#xff0c;为现代企业带来了更高程度的灵活性与智能化水平。随着数…

第1章 计算机系统概述

王道学习 1.1 操作系统的基本概念 1.1.1 操作系统的概念 1.1.2 操作系统的特征 操作系统是一种系统软件&#xff0c;但与其他系统软件和应用软件有很大的不同&#xff0c;它有自己的特殊性即基本特征。操作系统的基本特征包括并发、共享、虚拟和异步。这些概念对理解和掌握…

kail linux破解密码--- 详细过程(配合图文让你看了就会)

1.准备工作 1.vmware虚拟机 2.kali的系统 3.无线网卡一张(这个是必须的我买的是30多块) 4.这里为了实验&#xff0c;和直观的看到效果&#xff0c;用手机开了一个wifi然后使用kali进行破解 2.下载kali然后安装到虚拟机vmware 直接在官网下载 Get Kali | Kali Linux 我选…

WebXR实践——利用aframe框架浏览器展示全景图片

一、效果 话不多说&#xff0c;先上效果 二、代码 index.html <!DOCTYPE html> <html><head><meta charset"utf-8"><title>360&deg; Image</title><meta name"description" content"360&deg; Imag…

【机器学习】深入解析线性回归模型

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

高精度铸铁平台制造工艺有多精细——河北北重机械

高精度铸铁平台制造工艺通常包括以下几个步骤&#xff1a; 材料准备&#xff1a;选择合适的铸铁材料&#xff0c;并确保其质量符合要求。常用的铸铁材料包括灰铸铁、球墨铸铁等。 模具制造&#xff1a;根据平台的设计要求&#xff0c;制造适用的模具。模具一般由砂型、金属模具…

【python】flask基于cookie和session来实现会话控制

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

【开源-土拨鼠充电系统】鸿蒙 HarmonyOS 4.0 App+微信小程序+云平台

✨本人自己开发的开源项目&#xff1a;土拨鼠充电系统 ✨踩坑不易&#xff0c;还希望各位大佬支持一下&#xff0c;在Gitee或GitHub给我点个 Start ⭐⭐&#x1f44d;&#x1f44d; ✍Gitee开源项目地址&#x1f449;&#xff1a;https://gitee.com/cheinlu/groundhog-charging…

力扣Lc19--- 268. 丢失的数字(java版)-2024年3月20日

1.题目描述 2.知识点 &#xff08;1&#xff09;比如数组里面有n个数&#xff0c;然后计算这n个数的总和(用等差求和数列计算&#xff09;,然后减去数组的和&#xff0c;用总和减去数组和即为所得 &#xff08;2&#xff09;加强型 for 循环&#xff08;也称为 for-each 循环&…

单片机--数电(4)

触发器 数字电路中&#xff1a;分组合逻辑电路与时序逻辑电路两大类 组合逻辑电路的基本单元是门电路&#xff08;与或非等一些门电路&#xff09; 时序逻辑电路的基本单元是触发器 触发器与门电路的区别 门电路某一时刻的输出信号完全取决于该时刻的输入信号&#xff0c;…

销售数据分析怎么做?用好这5个数据分析方法与模型就足够了。

企业经营其实简单来说就是做买卖&#xff0c;有了买卖自然就产生了销售数据&#xff0c;那怎么能让这些销售数据产生价值呢&#xff1f;答案就是数据分析。通过对销售数据的分析&#xff0c;可以帮助企业及时洞察市场动向&#xff0c;发现企业销售过程中的问题&#xff0c;调整…

ResNet《Deep Residual Learning for Image Recognition》

ResNet论文学习 引言Deep Residual Learning 深度残差学习网络结构 总结代码复现 引言 深度网络自然地以端到端的多层方式集成低/中/高级特征和分类器&#xff0c;特征的“级别”可通过堆叠层的数量来丰富 随着网络层数加深&#xff0c;提取的特征越强&#xff0c;但是 网络…

表情识别数据集

表情视频数据集 在许多的研究中,研究者通常会把人脸表情识别区分为静态的人脸表情识别(static facial emotion recognition)和动态的人脸表情识别(dynamic facial emotion recognition)。前者希望通过单张图片辨别人的表情从而达到识别人情绪的目的,而后者希望感知视频/…

进程的概念 | PCB | Linux下的task_struct | 父子进程和子进程

在讲进程之前首先就是需要去回顾一下我们之前学的操作系统是干嘛的&#xff0c;首先操作系统是一个软件&#xff0c;它是对上提供一个良好高效&#xff0c;稳定的环境的&#xff0c;这是相对于用户来说的&#xff0c;对下是为了进行更好的软硬件管理的&#xff0c;所以操作系统…

TinyEMU源码分析之虚拟机初始化

TinyEMU源码分析之虚拟机初始化 1 初始化结构参数2 配置RAM地址空间3 初始化设备4 拷贝BIOS和Kernel5 手动写入5条指令6 体验第一条指令的执行 本文属于《 TinyEMU模拟器基础系列教程》之一&#xff0c;欢迎查看其它文章。 本文中使用的代码&#xff0c;均为伪代码&#xff0c…

vue2使用webSocket双向通讯

基于webSocket实现双向通信&#xff0c;使用webworker保持心跳。 由于浏览器的资源管理策略会暂停或限制某些资源的消耗&#xff0c;导致前端心跳包任务时效&#xff0c;后端接收不到webSocket心跳主动断开&#xff0c;因此需要使用webworker保持心跳 引入webworker npm insta…