【Spring】Spring事务管理

1. 事务的基本概念

1.1简介

  • 数据库事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
  • Spring的事务管理主要基于AOP(面向切面编程)技术,通过声明式或编程式的方式来实现。
  • Spring框架内部使用事务管理器的接口PlatformTransactionManager,来完成commitrollback
  • 针对不同的框架,提供不同的实现类

1.2ACID属性

  • 原子性(Atomicity):事务是一个原子操作单元,其对数据的修改要么全都执行,要么全都不执行。
  • 一致性(Consistency):事务必须使数据库从一个一致性状态变换到另一个一致性状态。
  • 隔离性(Isolation):在事务开始到事务结束前的中间过程中,由于隔离机制的存在,所以事务中所使用的数据资源都不会被其他事务所访问。
  • 持久性(Durability):一旦事务提交,则其结果就是永久性的,即使系统发生崩溃,事务执行的结果也不能被撤销。

2. Spring事务管理的实现方式

  • Spring提供了两种主要的事务管理方式:声明式事务管理和编程式事务管理。

2.1 声明式事务管理

  • 基于XML配置:通过在Spring配置文件中配置<tx:advice>和<aop:config>等元素,将事务管理切面应用到指定的方法上。
  • 基于注解:使用@Transactional注解在需要事务管理的方法或类上标记,Spring会自动为这些方法或类添加事务管理。

2.2 编程式事务管理

  • 编程式事务管理需要开发者在代码中显式地调用事务管理的方法,如PlatformTransactionManager的getTransaction、commit和rollback等。
  • 这种方式相对繁琐,且不利于代码的解耦和重用,因此在实践中较少使用。

3. Spring事务管理器

Spring提供了多种事务管理器,用于支持不同的事务处理策略和数据源。常见的事务管理器有:

  • DataSourceTransactionManager:用于JDBC数据源的事务管理。
  • HibernateTransactionManager:用于Hibernate框架的事务管理。
  • JpaTransactionManager:用于JPA框架的事务管理。
  • JtaTransactionManager:用于支持全局事务的JTA(Java Transaction API)环境。

4.事务的隔离级别

  • Spring支持四种事务隔离级别,这些级别可以通过@Transactional注解的isolation属性来设置。
  • 不同的隔离级别对事务的并发性和性能有不同的影响。
级别
描述
ISOLATION_DEFAULT
默认级别, mysql 数据库
ISOLATION_REPEATABLE_READ,Oracle 数据库默认级别
ISOLATION_READ_COMMITTED
ISOLATION_READ_UNCOMMITTED 读未提交,没有解决并发问题
ISOLATION_READ_COMMITTED 读已提交,解决脏读
ISOLATION_REPEATABLE_READ 可重复读,解决脏读、不可重复读
ISOLATION_SERIALIZABLE 串行化,不会产生并发问题

5. 事务的传播行为

  • Spring定义了7种事务的传播行为,用于指定当前方法被另一个事务方法调用时,应该如何处理事务。
  • 这些传播行为可以通过@Transactional注解的propagation属性来设置。

7种事务的传播行为:

传播行为
描述
PROPAGATION_REQUIRED
如果当前没有事务,则创建一个新的事务,如果当前存在
事务,则加入到这个事务中。
PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,则以非事务方式执行
PROPAGATION_REQUIRED_NEW 新建事务,如果当前事务存在,则把当前事务挂起
PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,则抛出异常
PROPAGATION_NOT_SUPPORTS 以非事务方式进行操作,如果当前存在事务,则把当前事务挂起
PROPAGATION_NEVER 以非事务方式进行操作。如果当前存在事务,则抛出异常
PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行,如果当前没有事务,则执行的方式与PROPAGATION_REQUIRED类似的操作
分析 REQUIRED\ REQUIRED_NEW \ NESTED 差别
异常状态
REQUIRED_NEW( 两个独立事务 )
REQUIRED( 同一个事务 )
NESTED(B的事务嵌
套在 A )
methodA 抛异常
methodB 正常
A 回滚, B 正常提交
A B 同时回滚
A B 同时回滚
methodA 正常
methodB 抛异常
1 、如果 A 中捕获 B 的异常,并没有继续向上抛异常,则 B 先回滚, A 正常提交;
2 、如果 A 捕获 B 的异常,默认则会将 B 的异常向上抛出, B 先回滚, A 再回滚
AB同时回滚
B 先回滚,
A 正常提交
methodA 抛异常
methodB 抛异常
B 先回滚, A 再回滚
AB同时回滚 AB同时回滚
methodA 正常
methodB 正常
B 先提交, A 再提交
AB同时提交AB同时提交

6. 事务的回滚规则

  • 默认情况下,Spring会在运行时异常(RuntimeException)和错误(Error)发生时回滚事务。
  • 如果需要自定义回滚规则,可以通过@Transactional注解的rollbackFor和noRollbackFor属性来指定。

7. 使用注意事项

  • 确保数据源和事务管理器正确配置。
  • 合理使用事务的传播行为和隔离级别。
  • 注意事务的边界和嵌套使用。
  • 避免在事务中执行非数据库操作(如发送邮件、调用远程服务等),以免破坏事务的原子性。
  • 对于只读操作,可以设置事务为只读模式以提高性能。

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

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

相关文章

仓库管理WMS软件(Warehouse Management Software)百科解析

一、什么是仓库管理软件&#xff08;WMS&#xff09;&#xff1f; 仓库管理软件&#xff08;WMS&#xff09;全称Warehouse Management System&#xff0c;是一种专门用于仓库作业流程优化和库存控制的软件系统。它通过先进的自动识别与数据采集技术&#xff0c;实现对仓库货物…

Leecode热题100---114:二叉树展开为链表

题目&#xff1a; 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。 展开后的单链表应该与二叉树 先序遍历 顺序相同…

SCSS基本使用

SCSS&#xff08;Sassy CSS&#xff09;是一种 CSS 预处理器&#xff0c;它是 CSS 语言的一个扩展&#xff0c;增加了变量、嵌套规则、混合&#xff08;mixins&#xff09;、函数等功能&#xff0c;使得编写 CSS 更加高效和易于维护。SCSS 代码最终会被编译成标准的 CSS 代码。…

Lambda表达式使用及详解

Java 8引入的Lambda表达式是一种重要的功能&#xff0c;它允许你以更简洁、更直接的方式传递方法。Lambda可以被用来代替只有单个抽象方法的接口的匿名实现类。这里有一些Lambda表达式的实际应用场景及其示例&#xff1a; 1. 集合操作 在处理集合时&#xff0c;如List或Set&a…

Oracle数据库中的PCTFREE解析

PCTFREE是Oracle数据库中用于表或索引段空间管理的一个重要存储参数。这个参数定义了一个数据块中保留的最小空闲空间百分比&#xff0c;旨在为现有行的未来更新预留空间。具体来说&#xff1a; 当设置一个数据块的PCTFREE值时&#xff0c;你实际上是告诉Oracle在这个数据块填满…

Spring Boot | Spring Boot 实现 “记住我“ 功能

目录: 一、SpringBoot 中 自定义 "用户授权管理" ( 总体内容介绍 )二、实现 "记住我" 功能 ( 通过 "HttpSecurity类" 的 rememberMe( )方法来实现 "记住我" 功能 ) :2.1 基于 "简单加密 Token" 的方式 ( 实现 "记住我&…

av_dump_format经验分析,FFmpeg获取媒体文件总时长(FLV获取总时长的误区)

播放器有个功能&#xff0c;当用户打开视频时&#xff0c;需要读取媒体文件的总时长等信息&#xff0c;不巧的时&#xff0c;获取FLV时总失败&#xff0c;下面来具体分析下FLV和MP4获取总时长的原因和区别&#xff1a; 播放器有个获取MediaInfo的接口&#xff0c;功能如下&am…

python web自动化(关键字驱动与POM)

1.关键字驱动解析 所谓的关键字驱动&#xff0c;本质就是函数封装的过程。 ⾃动化当中的封装⽬的是&#xff1a;拆分重复的⾏为代码和测试数据&#xff0c;增加可维护性和复⽤性 我们想要定义一个工具类 # 定义工具类&#xff08;基于基础的方法&#xff0c;进行的关键…

echarts全局设置饼图的颜色

&#x1f337;第一步 在js文件中写入你需要的颜色 这里的颜色也可以写渐变的 &#x1f337;下一步 在main.is中引用全局挂载 &#x1f337;最后一步 在初始化的时候加一个macarons即可 &#x1f337;第一步 在js文件中写入你需要的颜色 这里的颜色也可以写渐变的 (functi…

探索k8s集群中kubectl的陈述式资源管理

一、k8s集群资源管理方式分类 1.1陈述式资源管理方式&#xff1a;增删查比较方便&#xff0c;但是改非常不方便 使用一条kubectl命令和参数选项来实现资源对象管理操作 即通过命令的方式来实 1.2声明式资源管理方式&#xff1a;yaml文件管理 使用yaml配置文件或者json配置文…

【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法

文章目录 前言 Timer中断调度 Event中断调度 StateFlow调度 分析和应用 总结 参考资料 前言 近期在一些嵌入式系统开发项目中&#xff0c;在使用嵌入式处理器时&#xff0c;遇到了挺多费时费力的事情。所以利用晚上和周末时间&#xff0c;在这些方面深入研究了一下&…

全文索引-FullText

一、数据结构 倒排索引&#xff1a;存储单词与文档的映射 1、正向索引 正向索引结构如下: 文档1的ID→单词1的信息&#xff1b;单词2的信息&#xff1b;单词3的信息… 文档2的ID→单词3的信息&#xff1b;单词2的信息&#xff1b;单词4的信息… 2、反向索引 反向索引结构如…

AWS安全性身份和合规性之Inspector

Amazon Inspector 是一项漏洞管理服务&#xff0c;可持续扫描您的 AWS 工作负载&#xff0c;以查找软件漏洞和意外网络泄露。Amazon Inspector 会自动发现和扫描正在运行的亚马逊 EC2 实例、亚马逊弹性容器注册表 (Amazon ECR) Container Registry 中的容器映像&#xff0c;以及…

Joomla 3.7.0 (CVE-2017-8917) SQL注入漏洞环境

1 漏洞概述 Joomla是一个基于PHP的内容管理系统&#xff08;CMS&#xff09;&#xff0c;广泛应用于各类网站。2017年&#xff0c;Joomla 3.7.0版本被发现存在SQL注入漏洞&#xff08;CVE-2017-8917&#xff09;&#xff0c;攻击者可以利用该漏洞对数据库进行未授权查询或操作…

前端常用的状态码

常用状态码 常用状态码大家可以记一下&#xff0c;所有的也记不住&#xff0c;简洁几个字概括一下&#xff0c;方便大家进行记忆。 200 OK&#xff1a;请求成功 401 Unauthorized&#xff1a;未授权&#xff0c;未登录 403 Forbidde&#xff1a;已登录&#xff0c;但是对于…

The Sandbox 和 Bitkub 联手增强东南亚元宇宙中心

作为去中心化游戏虚拟世界和区块链平台的先驱&#xff0c;The Sandbox 正与泰国领先的区块链网络 Bitkub Blockchain Technology Co., Ltd. 展开创新合作。双方合作的目的是将Bitkub元宇宙的影响力扩展到The Sandbox&#xff0c;建立一个元宇宙中心&#xff0c;向用户承诺从 Bi…

C# GetManifestResourceStream 获取项目资源为null解决方案(亲测)

GetManifestResourceStream 获取项目资源为null 使用Stream s assembly.GetManifestResourceStream(Assembly.GetExecutingAssembly().GetName().Name resourceName) 获取资源文件&#xff0c;返回流为null&#xff0c;如图所示&#xff1a; 解决方案 设置资源文件的 属性&…

centos服务器常用清理脚本分享

做开发时&#xff0c;经常遇到服务器监控报警&#xff0c;日志占据大量的磁盘空间&#xff0c;需要清理。每次手动清理很麻烦。这里分享一些定时清理的脚本&#xff0c;减轻运维的工作量。将sh脚本与crontab定时任务结合&#xff0c;实现定时清理。 nacos日志清理脚本 nacos也…

WPF--几种常用定时器Timer汇总

1.WPF中常用4种Timer&#xff1a; System.Windows.Threading.DispatcherTimer(UI操作线程) 这是一个基于WPF Dispatcher的计时器。它可以在指定的时间间隔内触发Tick事件&#xff0c;并在UI线程上执行回调函数&#xff0c;方便进行UI更新操作。 System.Timers.Timer 这是一个基…

<MySQL> 【数据类型】

目录 一、数据类型一览 二、整型 &#xff08;一&#xff09;INT &#xff08;二&#xff09;BIT 三、浮点数 &#xff08;一&#xff09;FLOAT &#xff08;二&#xff09;DECIMAL &#xff08;三&#xff09;如何选择 四、字符 &#xff08;一&#xff09;CHAR &a…