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.rhkb.cn/news/155480.html

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

相关文章

手写Spring系列【一】IOC的简单实现笔记

前言: 👏作者简介:我是笑霸final,一名热爱技术的在校学生。 📝个人主页:个人主页1 || 笑霸final的主页2 📕系列专栏:项目专栏 📧如果文章知识点有错误的地方,…

docker 的数据管理

docker 容器中数据主要有两种方式 数据卷( Data Volumes ) 数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机的目录往载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现…

【RabbitMQ 实战】11 队列的结构和惰性队列

一、 队列的结构 队列的组成: 队列由 rabbit_amgqueue_process 和 backing_queue两部分组成。rabbit_amqqueue_process负责协议相关的消息处理,即接收生产者发布的消息、向消费者交付消息、处理消息的确认 (包括生产端的 confirm 和消费端的 ack) 等。…

Java架构师部署架构设计

目录 1 导学2 部署架构设计和部署架构图2.1 服务器数量和配置2.2 服务器软件配置2.3 网络环境设计2.4 部署架构图2.5 部署说明文档2.6 部署清单2.7 画部署架构图3 实战整体部署架构设计4 节点部署说明列表5 总结1 导学 本章的主要内容是整体架构设计的核心之一,部署架构设计相…

web 基础和http 协议

一、域名 域名的概念 IP地址不易记忆,域名方便记住,以便于用户进行搜索访问 早期使用Hosts文件解析域名地址 缺点: ① 主机名称重复 ② 主机维护困难 DNS(Domain Name System)域名系统 ① 分布式 将一个大的数…

08. 机器学习- 线性回归

文章目录 线性回归 LINEAR REGRESSION 从本次课程开始,大部分时候我将不再将打印结果贴出来了,因为太占用篇幅。小伙伴可以根据我的输出执行敲一遍代码来进行学习和验证。 同样是为了节省篇幅,我也不会再一行行那么仔细的解释代码了&#xff…

每日leetcode_LCP01猜数字

每日leetcode_LCP01猜数字 记录自己的成长&#xff0c;加油。 题目出处&#xff1a;LCP 01. 猜数字 - 力扣&#xff08;LeetCode&#xff09; 题目 解题 class Solution {public int game(int[] guess, int[] answer) {int count 0;for (int i 0 ; i< guess.length; i){…

redis 主从复制

配从不配主 主要开启密码 在redis.conf requirepass xxxx 在从机配置 查看主从关系 在主机或从机执行 info replication 注意点 从机可以读&#xff0c;但没有写的权限主从机同时启动&#xff0c; 主机写一个命令&#xff0c;从机复制一个命令 主机开启动&#xff0c;写入命…

Databend join reorder 策略

join order 的重要性 Join order 是指在执行SQL查询时&#xff0c;决定多个表进行 join 的顺序。它是数据库查询优化的一个重要方面&#xff0c;对查询性能和效率有着重要的影响&#xff0c; 不同的 join order 对性能可能有数量级的影响。 优化器优化 join order 的核心流程…

Nacos(替代Eureka)注册中心

Nacos初步学习 Nacos 是一个开源的服务注册和配置中心&#xff0c;它允许您注册、注销和发现服务实例&#xff0c;并提供了配置管理的功能。下面是Nacos的最基础用法&#xff1a; 1. 服务注册和发现&#xff1a; 首先&#xff0c;您需要将您的应用程序或服务注册到Nacos中。…

【LeetCode: 2034. 股票价格波动 | 有序表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

界面组件DevExpress WinForms v23.2新功能预览 - 增强MVVM相关功能

本文主要描述了DevExpress WinForms即将在几个月之后发布的v23.2中包含的新功能&#xff0c;持续关注我们获取更多最新资讯哦~ DevExpress WinForms有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。同时能完美构建流畅、美观且易于使用的应用…

查看本机Arp缓存,以及清除arp缓存

查看Arp缓存目录 Windows 系统使用 winR&#xff0c;输入cmd 在命令窗口输入 arp -a 删除Arp缓存目录 在命令窗口输入 arp -d * 查看主机路由表

ElasticSearch搜索引擎常见面试题总结

一、ElasticSearch基础&#xff1a; 1、什么是Elasticsearch&#xff1a; Elasticsearch 是基于 Lucene 的 Restful 的分布式实时全文搜索引擎&#xff0c;每个字段都被索引并可被搜索&#xff0c;可以快速存储、搜索、分析海量的数据。全文检索是指对每一个词建立一个索引&am…

AIGC AI绘画 Midjourney 参数大全详细列表

AIGC ChatGPT 职场案例 AI 绘画 与 短视频制作, Power BI 商业智能 68集, 数据库Mysql8.0 54集 数据库Oracle21C 142集, Office 2021实战, Python 数据分析, ETL Informatica 案例实战 Excel 2021实操,函数大全,图表大全,大屏可视化制作 加技巧500集 数据分析可视化T…

OpenCV中initUndistortRectifyMap ()函数与十四讲中去畸变公式的区别探究

文章目录 1.十四讲中的去畸变公式2. OpenCV中的去畸变公式3. 4个参数和8个参数之间的区别4.initUndistortRectifyMap()函数源码 最近在使用OpenCV对鱼眼相机图像去畸变时发现一个问题&#xff0c;基于针孔模型去畸变时所使用的参数和之前十四讲以及视觉SLAM中的畸变系数有一点不…

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

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

SpringCloud组件Ribbon的IRule的问题排查

最近很久没有写文章啦&#xff0c;刚好遇到了一个问题&#xff0c;其实问题也挺简单&#xff0c;但是还是得对源码有一定了解才能够发现。 最近在实现一个根据请求流量的标签&#xff0c;将请求转发到对应的节点&#xff0c;其实和俗称的灰度请求有点相似&#xff0c; 实现思…

IDEA 2023.2.2图文安装教程及下载

IDE 系列的第二个年度更新现已发布&#xff0c;涵盖 IntelliJ IDEA、WebStorm、PyCharm、DataGrip、GoLand、DataSpell 以及 All Products Pack 订阅中包含的其他工具。该版本还包括多项用户体验增强功能&#xff0c;例如 Search Everywhere&#xff08;随处搜索&#xff09;中…

Spring Boot项目在Windows上的自启动策略与Windows自动登录配置

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…