Spring的事务详解

Spring的事务详解

在这里插入图片描述

一,什么是Spring事务

Spring 事务是 Spring 框架提供的一种对事务进行管理的机制。在使用 Spring 事务时,可以通过注解或编程方式将需要进行事务管理的方法和代码块标记为事务性操作,当这些操作被执行时,Spring 会负责开启、提交或回滚数据库事务,以保证在多个操作之间的一致性。

Spring 事务的特点包括:

  1. 声明式事务:支持使用注解或 XML 配置来声明事务,让代码更加简洁和易于维护。 注解@Transactional
    在这里插入图片描述

  2. 编程式事务:同时还支持使用编程的方式来管理事务,更加灵活。TransactionTempale

在这里插入图片描述

  1. 多种传播行为设置:可以设置事务在什么样的情况下应该加入到当前事务中,以及何时应该新建一个事务。

  2. 多种隔离级别:可以设置事务的隔离级别,以控制不同事务之间的可见性。

  3. 异常处理:可以配置事务应该如何处理异常,包括是否回滚等。

Spring 事务的实现是基于 AOP(面向切面编程)的技术,将事务管理与业务逻辑分离,使得事务管理更加简单和高效。同时,Spring 事务还提供了对多个数据库事务进行管理的支持,能够确保在多个数据库之间进行操作时,保证整个事务的一致性。

总之,Spring 事务是一种非常实用和高效的数据库事务管理机制,具有灵活、高效、易于使用等优点,在企业级应用开发中得到了广泛应用。

二,事务四大特性

事务是数据库系统中用于确保数据一致性和完整性的重要概念。事务具有四大特性,通常被称为 ACID 特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。

  1. 原子性(Atomicity):原子性表示一个事务中的所有操作要么全部成功完成并永久保存,要么全部失败并回滚到事务开始前的状态。事务被视为不可分割的最小执行单元,要么全部执行,要么全部不执行,不存在中间状态。如果事务在执行中发生错误,系统将撤销所有已执行的操作,回滚到事务开始前的状态,以确保数据的一致性。

  2. 一致性(Consistency):一致性表示事务将数据库从一个一致状态转变为另一个一致状态。在事务开始之前和结束之后,数据库的完整性约束应该得到满足。这意味着事务中的操作必须符合预先定义的规则和约束,以确保数据的有效性和正确性。

  3. 隔离性(Isolation):隔离性定义了多个并发事务之间彼此隔离的程度。隔离性确保每个事务在执行期间都能够独立地进行,而不会受到其他并发事务的干扰。事务应该表现得好像是在系统中独立执行,即使在多个事务同时执行的情况下,也不会相互影响。隔离级别可以配置,从而平衡并发性和数据一致性之间的关系。

  4. 持久性(Durability):持久性表示一旦事务提交,其所做的修改将永久保存在数据库中,并且对于任何系统故障或崩溃,数据都不会丢失。当事务成功提交后,系统需要确保已经将数据写入到持久存储介质(如磁盘)中,以便能够在系统恢复后重新加载。

这四个特性共同确保了事务的可靠性和效果,使得数据库系统能够处理并发操作,并保持数据的一致性和可靠性。在设计和实现数据库应用程序时,开发人员需要了解和应用这些特性,以确保数据的正确性和稳定性。

三,事物传播机制

在这里插入图片描述

Spring 的事务传播行为是使用于管理多个事务方法的一种策略。它定义了在一个事务方法被另一个事务方法调用时,事务应该如何进行传播和处理。

Spring 框架提供了七种事务传播行为:

  1. REQUIRED(默认值):如果当前存在事务,则加入到当前事务中,如果当前没有事务,则新建一个事务。这是最常用的传播行为,适合大多数情况。

  2. SUPPORTS:如果当前存在事务,则加入到当前事务中,如果当前没有事务,则以非事务方式执行。适用于读取数据库操作。

  3. MANDATORY:要求当前必须存在事务,否则会抛出异常。

  4. REQUIRES_NEW:无论当前是否存在事务,都会新建一个事务,将当前事务挂起。适用于需要独立的、嵌套的事务。

  5. NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,则将其挂起。

  6. NEVER:以非事务方式执行操作,如果当前存在事务,则抛出异常。

  7. NESTED:如果当前存在事务,则在嵌套事务中执行。嵌套事务可以独立地提交或回滚,但它们依赖于外部事务,只有外部事务提交后才能生效。

事务传播行为允许开发人员根据业务需求精确地控制事务的边界和行为,确保在多个事务方法之间维护数据的一致性和完整性。通过合理选择事务传播行为,可以实现复杂的事务逻辑,并确保事务的正确执行和结果。需要根据具体的业务场景和需求来选择合适的传播行为。

四,spring 的事务隔离

在这里插入图片描述

Spring框架提供了多种事务隔离级别,可以通过配置来选择适合应用场景的隔离级别。事务隔离级别定义了事务并发执行时的可见性和互相影响程度。

以下是Spring框架支持的五种事务隔离级别:

  1. DEFAULT(默认值):采用底层数据库的默认隔离级别。对于大多数数据库来说,默认级别是Read Committed(已提交读),但具体取决于数据库的实现。

  2. READ_UNCOMMITTED(读取未提交数据):最低的隔离级别,允许一个事务读取另一个事务尚未提交的数据。可能会导致脏读、不可重复读和幻读的问题。

  3. READ_COMMITTED(读取已提交数据):要求一个事务只能读取到已经提交的数据。避免了脏读的问题,但仍然可能出现不可重复读和幻读的问题。

  4. REPEATABLE_READ(可重复读):要求一个事务在整个过程中多次读取同样的数据时,结果保持一致。避免了脏读和不可重复读的问题,但可能出现幻读的问题。

  5. SERIALIZABLE(串行化):最高的隔离级别,通过强制事务串行执行来避免脏读、不可重复读和幻读的问题。但这会降低并发性能,因为事务需要按照顺序逐个执行。

对于不同的应用场景,可以选择不同的事务隔离级别来平衡数据一致性和并发性能。如果应用程序需要更高的并发性能,可以选择较低的隔离级别,如READ_COMMITTED。如果数据的一致性要求更高,可以选择较高的隔离级别,如SERIALIZABLE。

除了事务隔离级别,Spring还提供了以下解决方案来处理更复杂的并发问题:

  1. 乐观锁(Optimistic Locking):通过版本号或时间戳等机制,在读取数据时不加锁,在更新数据提交时检查是否有其他事务已经修改过该数据。

  2. 悲观锁(Pessimistic Locking):在读取或更新数据时,使用锁机制将数据标记为不可修改状态,以防止其他事务对其进行操作。

  3. 分布式事务(Distributed Transaction):用于跨多个数据库或系统的事务管理,保证事务的一致性和隔离性。

通过选择合适的事务隔离级别和采用适当的解决方案,可以确保在并发操作中维护数据的一致性和完整性。这些技术和策略可以根据具体的业务需求来灵活应用。

五,Spring事务实现基本原理

Spring框架的事务管理是建立在标准的Java事务API(即JTA、JDBC或Hibernate)之上的。它提供了一个抽象层,隐藏了不同事务API的实现细节,为应用程序提供了一致的编程模型。

Spring框架使用代理模式来实现对事务的管理。当需要开启一个事务时,Spring将会创建一个代理对象并将其注入到目标对象中。在代理对象中,Spring利用事务切面来管理事务的生命周期,即在方法调用前后开启和提交/回滚事务,并进行相关的异常处理。

Spring框架支持两种代理模式:基于接口的代理和基于类的代理。基于接口的代理是采用JDK动态代理实现的,而基于类的代理是采用CGLIB实现的。

基于接口的代理只能代理实现了接口的类,而基于类的代理可以对任何类进行代理,但目标类必须至少有一个非final的方法才能被代理。因此,在可行的情况下,Spring倾向于使用基于接口的代理。

当使用基于类的代理时,Spring会为目标类生成一个子类,并在子类中添加事务切面逻辑。因此,代理对象实际上是目标类的子类对象。在使用基于类的代理时,需要注意原始目标类和代理类的生命周期问题。

总的来说,Spring框架通过代理模式和事务切面实现了对事务的统一管理,并且在不同的事务API(如JTA、JDBC或Hibernate)之间提供了一致的编程模型。同时,Spring还支持多种事务隔离级别和解决方案,可以根据具体的业务需求来调整事务行为。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库基础:概念、分类、作用和特点

文章目录 概要DB-Engines 排名数据库的分类数据库的作用数据库的特点数据库的应用小结 概要 数据库是按照数据结构来组织、存储和管理数据的仓库。它是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。数据库可以被视为电子化的文件柜,用…

详细分析Python爬虫中的xpath(附Demo)

目录 前言1. 基本知识2. 常用API3. 简易Demo 前言 关于爬虫的基本知识推荐阅读:Python爬虫从入门到应用(超全讲解) 该知识点需要提前安装相关依赖:pip install lxml 1. 基本知识 XPath(XML Path Language&#xf…

torchvision中的数据集使用

torchvision中的数据集使用 使用和下载CIFAR10数据集 输出测试集中的第一个元素(输出img信息和target) 查看分类classes 打断点–>右键Debug–>找到classes 代码 import torchvisiontrain_set torchvision.datasets.CIFAR10(root"./data…

数据结构|排序总结(1)|直接插入排序

排序分类 插入排序:直接插入排序,希尔排序 选择排序:选择排序,堆排序 交换排序:冒泡排序,快速排序 归并排序 插入排序 直接插入排序 相当于摸牌,例如我们现在手上有{2,4&#xff0…

基于单片机光伏太阳能跟踪系统设计

**单片机设计介绍,基于单片机光伏太阳能跟踪系统设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机光伏太阳能跟踪系统的设计,旨在通过单片机技术实现对光伏太阳能设备的自动跟踪,以提高太阳…

前后端开发之——文章分类管理

原文地址:前后端开发之——文章分类管理 - Pleasure的博客 下面是正文内容: 前言 上回书说到 文章管理系统之添加文章分类。就是通过点击“新建文章分类”按钮从而在服务端数据库中增加一个文章分类。 对于文章分类这个对象,增删改查属于配…

k8s 持久化存储解析:hostPath与NFS的应用与探索

🐇明明跟你说过:个人主页 🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅 🔖行路有良友,便是天堂🔖 目录 一、前言 1、k8s为什么要有持久化存储 2、NFS简介…

post请求搜索功能爬虫

<!--爬虫仅支持1.8版本的jdk--> <!-- 爬虫需要的依赖--> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.2</version> </dependency>…

基于单片机干湿垃圾自动分类系统

**单片机设计介绍&#xff0c;基于单片机干湿垃圾自动分类系统 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的干湿垃圾自动分类系统是一个集成传感器技术、机械控制和单片机编程于一体的自动化解决方案。该系统的主要目标是实…

归并排序和计数排序

计数排序 计数排序是一种非比较排序。 count_sort 还会用到相对大小。 节省空间。 前提是遍历数组找到max和min 从而进一步确定range。 然后将数在数组中的相对位置&#xff0b;min对其进行输出。 void count_sort(int* a, int n) {int max a[0], min a[0],cnt0;for …

漂亮的个人主页HTML源码

漂亮的个人主页HTML源码&#xff0c;页面简约&#xff0c;一个卡片式的风格介绍&#xff0c;喜欢的朋友们可以拿去研究 源码下载 漂亮的个人主页HTML源码

TCP挥手中TIME_WAIT存在的原因

四次挥手的一般过程如图所示&#xff1a; 在客户端收到FIN结束报文的时候不是立刻进入CLOSED状态&#xff0c;而是进入TIME_WAIT状态&#xff0c;一般等2MLS后进入关闭状态。 原因&#xff1a; 1.可靠地终止 TCP 连接。 2.保证让迟来的 TCP报文段有足够的时间被识别并丢弃。 …

【CSDN云VS腾讯云】要不然怎么说CSDN开发云是打工人和学生党的福音呢?

&#x1f341;作者简介&#xff1a;&#x1f3c5;云计算领域优质创作者&#x1f3c5;新星计划第三季python赛道TOP1&#x1f3c5; 阿里云ACE认证高级工程师&#x1f3c5; ✒️个人主页&#xff1a;小鹏linux &#x1f48a;个人社区&#xff1a;小鹏linux&#xff08;个人社区&a…

Go 实战|使用 Wails 构建轻量级的桌面应用:仿微信登录界面 Demo

概述 本文探讨 Wails 框架的使用&#xff0c;从搭建环境到开发&#xff0c;再到最终的构建打包&#xff0c;本项目源码 GitHub 地址&#xff1a;https://github.com/mazeyqian/go-run-wechat-demo 前言 Wails 是一个跨平台桌面应用开发框架&#xff0c;他允许开发者利用 Go …

ElasticSearch分词检索

1. 倒排索引&#xff1a;表示一种数据结构&#xff0c;分词词条与文档id集合的隐射关系 2. 它跟关系型数据库是一种互补的关系&#xff0c;因为关系型数据库支持事务操作&#xff0c;满足ACID原则 #ik分词器下载 https://github.com/infinilabs/analysis-ik/releases POST /_a…

前端学习之DOM编程-案例div移动

这个案例是当你的鼠标按压下去后&#xff0c;div跟着你的鼠标移动而移动&#xff0c;当你的鼠标抬起后&#xff0c;div不随着鼠标移动而移动。类似于电脑移动应用图标的感觉。 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset&quo…

《Java面试自救指南》(专题四)Java基础

文章目录 有序集合有哪些?线程安全的集合有哪些&#xff1f;HashMap底层原理ConcurrentHashMap的底层数据结构ArrayList底层原理&#xff0c;ArrayList和Vector/LinkedList的区别String&#xff0c;StringBuffer&#xff0c;StringBuilder的区别 扩展&#xff1a;String不可变…

【THM】Exploit Vulnerabilities(利用漏洞)-

介绍 在这个房间里,我们将讨论一些识别漏洞的方法,并结合我们的研究技能来了解这些漏洞是如何被滥用的。 此外,您还会发现一些公开可用的资源,这些资源是您在执行漏洞研究和利用时的技能和工具的重要补充。然后,您将在房间的最后将所有这些应用到实际挑战中。 自动化与…

2021-2023年全国地表水水质监测数据集

1.监测范围 国家地表水水质自动监测网水质自动监测站。 2.监测项目监测项目为国家水质自动监测站配备的监测指标&#xff0c;主要包括五参数(水温、pH、溶解氧、电导率和浊度)、氨氮、高锰酸盐指数、总氮、总磷&#xff0c;部分水站增测总有机碳、叶绿素a、藻密度、VOCs、生物…

Day:004(2) | Python爬虫:高效数据抓取的编程技术(数据解析)

正则表达式实战-腾讯新闻 需求&#xff1a; 使用正则获取腾讯新闻标题内容 网站&#xff1a;https://sports.qq.com/ 代码&#xff1a; import reimport requests from fake_useragent import UserAgenturl https://sports.qq.com/ # 构建请求头信息 headers {User-Agent:…