Spring5应用之事务属性

作者简介:☕️大家好,我是Aomsir,一个爱折腾的开发者!
个人主页:Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客
当前专栏:Spring5应用专栏_Aomsir的博客-CSDN博客

文章目录

  • 参考文献
  • 前言
  • 事务属性
    • 什么是事物属性?
    • 如何添加事务属性?
  • 隔离属性
    • 脏读
      • 解决方案
    • 不可重复读
      • 解决方案
    • 幻影读
      • 解决方案
    • 注意事项
  • 传播属性
    • 解决方案
  • 只读属性
  • 超时属性
  • 异常属性
  • 总结

参考文献

  • 孙哥suns说Spring5~学不会Spring? 因为你没找对人~孙帅
  • Spring官方文档

前言

在前两篇文章中,我们深入探索了Spring与MyBatis的整合技术,并详细讨论了Spring在事务处理方面的能力。今天,我决定进一步深入研究Spring,在事务属性上进一步的深入研究

事务属性

什么是事物属性?

事务属性是用来描述事务特性的一组值。主要包括隔离属性传播属性只读属性超时属性异常属性。通过这些属性,我们可以全面地描述和管理事务的行为

如何添加事务属性?

在上一篇文章中,我们已经探讨了如何在原始方法的类或方法上使用@Transaction注解来定义事务的切入点。要设置事务属性,我们只需在这一注解中配置相应的属性值。例如,isolation用于指定隔离级别propagation表示传播行为readOnly标识该事务是否为只读rollbackFor定义哪些异常会触发事务回滚,而timeOut指定事务的超时时间。接下来,我们会详细解析每一个属性的具体值和含义,以帮助大家更深入地理解和使用事务属性

隔离属性

隔离属性主要描述了事务如何解决数据库事务并发操作中的问题。在此之前,我们首先要明确什么是并发,以及并发中可能会遇到哪些问题,以及如何解决这些问题。

什么是并发? 并发是指多个事务在同一时刻,对相同的数据进行访问和操作。

并发会产生哪些问题? 并发操作中可能出现的问题包括脏读不可重复读幻影读

并发问题如何解决? 并发中的问题可以通过设定合适的隔离属性来解决。根据隔离属性的不同值,我们可以有效地避免或解决在并发处理过程中出现的这些问题

脏读

所谓脏读,是指一个事务读取到了另一个事务尚未提交的数据,这种操作可能导致当前事务中的数据不一致。想象一个场景:如果事务的隔离级别设置得不够高,它可能会读取到另一事务已修改但尚未提交的数据。如果在此基础上,我们对这份数据进行了进一步的修改、添加或删除,而后来那个外部事务决定回滚,那么当前事务所做的所有操作都可能变得无效或导致数据错误

解决方案

为了避免脏读,可以将事务的隔离属性设置为“读已提交”。这样,事务只能读取其他事务已经提交的数据,从而确保数据的一致性。在代码中,这可以通过以下注解属性来实现:

@Transaction(isolation=Isolation.READ_COMMITTED)

不可重复读

所谓不可重复读,是指在同一个事务内多次读取相同数据时,得到的结果不同。举个例子,假设在事务A中,第一次查询某数据得到的结果是1000。而在事务A的两次查询之间,另外一个事务B将这个数据减少了200。当事务A再次查询时,得到的结果就变成了800,从而导致事务A中出现了数据不一致的情况

解决方案

为了避免不可重复读的问题,我们可以将事务的隔离属性设置为“可重复读”。这样的设置确保在事务执行过程中,对同一数据的多次读取都能获得一致的结果。在代码中,可以通过以下注解属性来实现:

其本质是为相关数据加上行锁,确保在当前事务执行期间,其他事务不能修改这部分数据

@Transaction(isolation=Isolation.REPEATABLE_READ)

幻影读

所谓幻影读,是指在同一个事务中对整张表进行多次统计查询时,得到的结果各不相同,从而在事务内产生数据不一致的问题

解决方案

为了避免幻影读的问题,我们可以将事务的隔离属性设置为“串行化”(SERIALIZABLE)。这样的设置可以确保在事务执行过程中,对整张表的多次统计查询都能获得一致的结果。在代码中,可以通过以下注解来实现:

其核心机制是为整张表加上表锁,确保在当前事务执行期间,其他事务不能对此表进行添加或删除操作。

@Transaction(isolation=Isolation.SERIALIZABLE)

注意事项

  1. 数据库默认隔离级别: Spring提供的事务属性默认值会根据不同类型的数据库的默认隔离级别进行动态选择。
  2. 灵活选择隔离属性: 在实际应用中,我们应当灵活地选择隔离属性。根据具体的业务需求,选择合适的隔离属性,当然,默认的设置通常也是推荐的。
  3. 解决并发问题: 在实战中遇到并发问题时,常用的解决方法是采用悲观锁。例如,可以使用JPA的Version或者通过MyBatis的拦截器进行自定义开发

传播属性

传播属性主要描述了如何解决事务嵌套的问题。事务嵌套发生在一个主事务中包含多个子事务的情况。

例如,当AService中的a方法启动一个事务时,这个a方法可能会调用BService的b方法和CService的c方法,这两个方法都各自拥有独立的事务,这种情况下就构成了事务嵌套。这样的嵌套可能导致各个子事务之间相互影响,进而使主事务失去其原子性。

通过正确地设置传播属性,我们可以确保在整个操作过程中只存在一个统一的事务。

解决方案

当我们需要设定事务的传播行为,可以在事务注解中添加propagation属性。各个传播属性的具体值及其含义可以参考下表。

在实际开发中,REQUIREDSUPPORTS这两个传播属性可以解决99%的场景需求

默认的传播属性是REQUIRED,因此对于增、删、改的方法,我们通常不需要手动设置。而对于查询方法,我们则需要手动将其传播属性设置为SUPPORTS
在这里插入图片描述

只读属性

对于仅涉及查询操作的业务方法,我们可以添加只读属性,从而优化运行效率。这可以通过readOnly属性来实现。虽然它的默认值是false,但在需要的时候,我们可以手动开启它,使查询操作更加高效

超时属性

超时属性定义了事务执行的最长允许时间。这在某些场景下尤为关键,例如,当当前事务所需的数据被另一个事务或代码锁定时,本事务可能需要等待并尝试加锁。 我们可以通过timeout属性来设置超时限制,其单位为秒。设定超时属性后,为了验证其效果,我们可以在业务方法中插入线程休眠代码来进行模拟和测试

异常属性

异常属性指定了在事务中发生何种异常时应执行回滚操作,以及在哪些异常下应提交数据。我们可以通过属性rollbackFornoRollbackFor来进行设置。

在Spring的事务管理中,异常属性的默认设置是

  • 当事务中发生RuntimeException及其子类的异常时,系统会自动进行回滚
  • 当事务中发生Exception及其子类的异常时,则默认执行提交操作。

对于大多数实际场景,建议沿用此默认值,尤其是对于RuntimeException及其子类

总结

经过上述详细的探讨,我们对Spring事务中的各项属性有了深入的了解。现在,我们来做一个简明扼要的总结:

  1. 隔离属性:推荐使用默认值。
  2. 传播属性:对于增删改操作,建议直接使用默认值,即REQUIRED。而对于查询操作,应手动设置为SUPPORTS。
  3. 只读属性:对于增删改操作,使用默认值,即false;对于查询操作,应手动设置为true。
  4. 超时属性:根据具体业务需求来决定,但默认值为-1。
  5. 异常属性:建议使用默认设
    因此,总结如下:
  • 对于增删改操作:@Transaction
  • 对于查询操作:@Transaction(propagation=Propagation.SUPPORTS, readOnly=true)

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

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

相关文章

python sqlalchemy(ORM)- 01 简单使用

[doc] 简介 sqlalchemy 是python操作sql数据库的工具,是一个对象关系映射的框架;在python中提供高效、高性能的数据库访问,企业级的数据持久化模式;pypi 地址sqlalchemy官网 sqlalchemy架构 sql操作是独立于ORM操作的&#xf…

vscode 资源管理器移动到右边

目录 vscode 资源管理器移动到右边 vscode 资源管理器移动到右边 点击 文件》首选项》设置》工作台》外观》 找到这个配置下拉选择左右

单元测试很难么?也没有吧

前言 你可能会用单元测试框架,python的unittest、pytest,Java的Junit、testNG等。 那么你会做单元测试么!当然了,这有什么难的? test_demo.py def inc(x):return x 1def test_answer():assert inc(3) 4 inc() 是…

三次挥手和四次握手

TCP建立连接(三次握手) 经过DNS域名解析后,获取到了服务器的IP地址,在获取到IP地址后,便会开始建立一次连接,这是由TCP协议完成的,主要通过三次握手进行连接。 第一次握手: 建立连…

(部署服务器系列一)虚拟机模拟部署服务器

1、下载安装vmware 15 (win7最高支持版) 2、下载安装CentOS 配置2核2g(最少)磁盘100g(不会实际占有)选择时区-上海配置分区:https://blog.csdn.net/qq_35363507/article/details/127390889 &a…

设计模式02———建造者模式 c#

首先我们打开一个项目 在这个初始界面我们需要做一些准备工作 建基础通用包 创建一个Plane 重置后 缩放100倍 加一个颜色 更换天空盒(个人喜好) 任务:使用【UI】点击生成6种车零件组装不同类型车 【建造者模式】 首先资源商店下载车模型 将C…

虚幻引擎:如何才能对音波(声音资产)进行逻辑设置和操作

案列:调整背景音乐大小 1.创建一个SoundCue 2.进入创建的SoundCue文件 3. 创建音效类和音效类混合 4.进入SoundCue选择需要的音效类 5.然后音效类混合选择相同的音效类 6.然后蓝图中通过节点进行控制音量大小

把二叉搜索树转换为累加树

题目链接 把二叉搜索树转换为累加树 题目描述 注意点 树中的节点数介于 0 和 10000 之间每个节点的值介于 -10000 和 10000 之间树中的所有值 互不相同给定的树为二叉搜索树 解答思路 因为二叉搜索树的性质是左子树的值始终小于根节点的值,右子树的值始终大于根…

Android组件通信——ActivityGroup(二十五)

1. ActivityGroup 1.1 知识点 (1)了解ActivityGroup的作用; (2)使用ActivityGroup进行复杂标签菜单的实现; (3)使用PopupWindow组件实现弹出菜单组件开发; 1.2 具体…

el-upload手动上传图片,上传后隐藏上传样式(el-upload上传单张图片,vue2)

简介:上期介绍了使用el-upload上传文件,这次来介绍一下如何使用el-upload上传图片,只能上传一次,上传图片后隐藏上传按钮部分。 实现效果图: 1、首先,想要在项目中使用el-upload组件,同样&#…

检验检疫系统(LIS)源码:C# + MVC + SQLserver + Redis

LIS系统源码技术特点:采用.Net Core新的技术框架、DEV报表、前端js封装、分布式文件存储、分布式缓存等,支持LIS独立部署,Docker部署等多种方式。 技术架构:ASP.NET CORE 3.1 MVC SQLserver Redis等 开发语言:C…

基于全景运动感知的飞行视觉脑关节神经网络全方位碰撞检测

https:/doi.org/10.1155/2023/5784720 摘要: 生物系统有大量的视觉运动检测神经元,其中一些神经元可以优先对特定的视觉区域做出反应。然而,关于如何使用它们来开发用于全向碰撞检测的神经网络模型,很少有人做过工作。为此&#…

【算法优选】 二分查找专题——贰

文章目录 😎前言🌲[山脉数组的峰顶索引](https://leetcode.cn/problems/peak-index-in-a-mountain-array/)🚩题目描述:🚩算法思路🚩代码实现: 🌴[寻找峰值](https://leetcode.cn/pro…

Oracle 简介与 Docker Compose部署

最近,我翻阅了在之前公司工作时的笔记,偶然发现了一些有关数据库的记录。当初,我们的项目一开始采用的是 Oracle 数据库,但随着项目需求的变化,我们不得不转向使用 SQL Server。值得一提的是,公司之前采用的…

golang使用energy开发GUI桌面程序,CEF,LCL

1、概述 仓库:https://github.com/energye/energy 文档:https://energy.yanghy.cn/ Energy 是 Go 基于 CEF(Chromium Embedded Framework) 开发的框架,内嵌 CEF 二进制 使用 Go 和 Web 端技术 ( HTML CSS JavaScript ) 构建支持Windows, …

MongoDB——centOS7环境Mongodb权限管理(图解版)

目录 一、MongDB权限概述1.1、MongDB权限概述1.2、MongDB权限列表 二、Mongodb权限管理示例2.1、创建账号2.1.1、创建管理员用户2.1.2、开启认证2.1.3、创建普通账号 一、MongDB权限概述 1.1、MongDB权限概述 mongodb是没有默认管理员账号,所以要先添加管理员账号…

解决echarts配置滚动(dataZoom)后导出图片数据不全问题

先展现一个echarts&#xff0c;并配置dataZoom&#xff0c;每页最多10条数据&#xff0c;超出滚动 <div class"echartsBox" id"echartsBox"></div>onMounted(() > {nextTick(() > {var chartDom document.getElementById(echartsBox);…

ROS仿真软件Turtlebot-Gazebo的安装使用以及错误处理[机器人避障]

很多时候由于机器人价格比较贵&#xff0c;而且会因为环境因素、操作失误或者摔坏等&#xff0c;所以我们可以先在仿真软件上做测试&#xff0c;也可以避免这些问题&#xff0c;虽然没有那么真实感&#xff0c;可毕竟是免费的嘛。我们可以在这些仿真的机器人身上去学习如何控制…

Java使用opencv实现人脸识别、人脸比对

1. opencv概述 OpenCV是一个开源的计算机视觉库&#xff0c;它提供了一系列丰富的图像处理和计算机视觉算法&#xff0c;包括图像读取、显示、滤波、特征检测、目标跟踪等功能。 opencv官网&#xff1a;https://opencv.org/ opencv官网文档&#xff1a;https://docs.opencv.or…

Spring三级缓存流程再梳理

本文主要是说下在使用spring时遇到了循环依赖&#xff0c;Spring利用三级缓存怎么解决 getBean(beanName)doGetBean(name, null, null, false);getSingleton(beanName)方法&#xff0c; 最后会通过addSingleton(beanName, singletonObject)存到一级缓存里面去createBean(beanN…