Spring事务(ACID特性、隔离级别、传播机制、失效场景)

news2024/10/7 10:15:57

一、事务的ACID特性

原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency)
事务前后数据的完整性必须保持一致。
隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

二、事务可能存在的问题

1、脏读

读到其他事务未提交的数据或已回滚的脏数据。

2、不可重复读

事务A读取一条数据,然后执行业务逻辑的时候事务B将这条数据修改了,导致A再次读取这条数据时发现数据不匹配了。

3、幻读
事务A根据条件索引得到N条数据,然后事务B改变了这N条数据之外的M条数据或增加了M条数据使得符合事务A的检索条件,导致事务A再次检索时发现了N+M条数据,产生了幻觉一样。

三、MySQL的事务隔离级别

1、READ_UNCOMMITTED  读未提交

也叫未提交读,该隔离级别的事务可以看到其他事务中未提交的数据。该隔离级别因为可以读取到其他事务中未提交的数据,而未提交的数据可能会发生回滚,因此我们把该级别读取到的数据称之为脏数据,把这个问题称之为脏读;
2、READ_COMMITTED  读已提交

也叫提交读,该隔离级别的事务能读取到已经提交事务的数据,因此它不会有脏读问题。但由于在事务的执行中可以读取到其他事务提交的结果,所以在不同时间的相同 SQL 查询中,可能会得到不同的结果,这种现象叫做不可重复读;
3、REPEATABLE_READ  可重复读 (mysql默认隔离级别)

它能确保同一事务多次查询的结果一致。但也会有新的问题,比如此级别的事务正在执行时,另一个事务成功的插入了某条数据,但因为它每次查询的结果都是一样的,所以会导致查询不到这条数据,自己重复插入时又失败(因为唯一约束的原因)。明明在事务中查询不到这条信息,但自己就是插入不进去,这就叫幻读 (Phantom Read);
4、SERIALIZABLE  串行化

最高的事务隔离级别,它会强制事务排序,使之不会发生冲突,从而解决了脏读、不可重复读和幻读问题,但因为执行效率低,所以真正使用的场景并不多
 

四、spring事务的隔离级别

spring的的事务隔离级别与mysql一致,多了一个默认隔离级别:

DEFAULT:Spring 中默认的事务隔离级别 ,以连接的数据库的事务隔离级别为准。

当mysql和spring都配置了事务的隔离级别时,以spring配置为准。

五、spring事务的传播机制

传播行为描述方法B定义的事务类型A方法有事务A方法无事务
REQUIRED默认的传播特性,如果当前没有事务则新建一个事务;如果当前存在事务则加入当前事务。@Transactional(propagation = Propagation.REQUIRED) AB合成一个事务B新建事务
SUPPORTS当前存在事务则加当前事务,当前没有事务则以非事务方式执行。@Transactional(propagation = Propagation.SUPPORTS)B加入到A的事务中B无事务
MANDATORY当前存在事务则加入当前事务,如果当前没有事务则抛出异常。@Transactional(propagation = Propagation.MANDATORY)B加入到A的事务中B抛异常
REQUIRES_NEW创建一个新事务,如果当前有事务则挂起当前事务。@Transactional(propagation = Propagation.REQUIRES_NEW)B新建一个自己的事务,与A隔离B新建事务
NOT_SUPPORTS以非事务方式执行,如果当前存在事务则挂起事务。@Transactional(propagation = Propagation.NOT_SUPPORTS)挂起A事务,B以无事务方式执行B无事务
NEVER不使用事务,如果当前有事务则抛出异常。@Transactional(propagation = Propagation.NEVER)B抛异常B无事务
NESTED如果当前有事务则嵌套在当前事务中执行,否则新建一个事务。@Transactional(propagation = Propagation.NESTED)B新建一个A的子事务,受A影响但不影响AB新建事务

六、spring事务的失效场景

1、bean对象没有被spring容器管理

2、方法的访问修饰符不是public

3、数据库不支持事务

4、数据源没有配置事务管理器

5、同类中无事务方法调用有事务方法

6、异常被捕获

7、异常类型错误或配置错误(传播类型不支持事务)

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

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

相关文章

数据库概念

定义: 数据库(Database 简称DB)是持久存储有组织/可共享数据/的容器 数据库管理系统(MySQL、Oracle、DB2)是操作/和管理数据库/的软件 分类: 关系(型)数据库 (MySQL、Oracle、SQL Server、SQLite、DB2) 非关系(型)数据库 (Redis…

大模型 Dalle2 学习三部曲(二)Latent Diffusion Models学习

引言 Diffusion model大获成功,但是它的短板也很明显,需要大量的计算资源,并且推理速度比较慢。如何才能提升Diffusion model的计算效率。业界有各种各样的改进,无疑Latent Diffusion Models(潜在扩散模型,…

基于Java+SpringBoot+Vue前后端分离善筹网(众筹)设计和实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

Bootstrap的行、列布局设计(网络系统设计)

目录 00-基础知识01-等宽列布局02-指定某一列的宽度03-根据内容自动改变列的宽度04-五种预定义列宽度 .col、.col-sm-*、.col-md-*、.col-lg-*、.col-xl-*05-不同视口宽度按不同的分列方案划分06-删除列内容的盒模型的外边距07-超过12列怎么办?08-重新排列各列的顺序…

【数据结构初阶】一. 复杂度讲解

相关代码gitee自取: C语言学习日记: 加油努力 (gitee.com) 接上期: 学C的第三十四天【程序环境和预处理】_高高的胖子的博客-CSDN博客 1 . 算法效率 (1). 什么是数据结构: 数据结构(Data Structure)是计算机存储、…

MyBatis Plus 学习笔记

MyBatis Plus 国产的开源框架,基于 MyBatis 核心功能就是简化 MyBatis 的开发,提高效率。 MyBatis Plus 快速上手 Spring Boot(2.3.0) MyBatis Plus(国产的开源框架,并没有接入到 Spring 官方孵化器中) 1、创建 …

Grad-CAM 小陈读paper系列(摘要加引言)

Abstract 我们提出了一种基于卷积神经网络 (CNN) 的模型的决策生成“视觉解释”的技术,使它们更加透明。我们的方法——梯度加权类激活映射(Grad-CAM), 使用任何目标概念的梯度(例如“狗”甚至标题的 logits&#xf…

新品登场!雅特力发布AT32F402与AT32F405高速USB2.0 OTG MCU

因应高速USB市场需求,产品技术不断推陈出新,USB2.0发展带来的高速连接能力,优化消费者的产品使用体验,且由于支持即插即用和热插拔,提高设备易用性,USB接口在各项设备中成为主流通用接口。在USB2.0标准中&a…

网站做SEO为什么见效慢?都有哪些原因导致?

SEO是一种具有一定运营周期的网络营销模式,与其他网络营销方式不同,它在短时间内可能不会产生营销效果,因为网站SEO优化是一项依赖于积累和坚持的工作。一般来说,搜索引擎优化的结果在一年左右会更加稳定。之所以在一些情况下见效…

【⑰MySQL】 变量 | 循环 | 游标 | 处理程序

前言 ✨欢迎来到小K的MySQL专栏,本节将为大家带来MySQL变量 | 循环 | 游标 | 处理程序的分享✨ 目录 前言1. 变量1.1系统变量1.2 用户变量 2. 定义条件与处理程序2.1 案例分析2.2 定义条件2.3 定义处理程序2.4 案例解决 3. 流程控制3.1 分支结构3.2 循环结构3.3 跳转…

leaflet · 初体验

首先关于地图的组件有很多,leaflet就是其一,Leaflet 是一个开源的 JavaScript 库,用于在网页上创建交互式地图。它提供了一系列易于使用的函数和方法,使开发者可以轻松地添加地图、标记、图层和交互功能。 通过命令下载插件l…

Astro建站教程:安装nodejs,npm下载Astro,安装扩展

下载Nodejs LTS版:https://nodejs.org/en 安装步骤全默认即可,安装路径可以根据自己的爱好更改在桌面右键打开cmd或powershell,输入node -v和npm -v测试是否安装成功 浏览器打开https://docs.astro.build/en/install/auto/ 复制里面的npm cre…

Sigrity Power DC 19 导入translator转换后文件显示unsupported file

Sigrity Power DC 19 导入translator转换后文件显示unsupported file的解决办法 先create New Workspace,然后load Layout 选择Load an existing Layout 选择spd文件 List item

Transform和小写transform的关系

1.为什么Transform类是保护的不能通过new 来实例化对象,也没有静态函数,而Rotate()这种方法却属于它,该如何访问? Transform 类还是被保护的不允许用户修改! protected Transform(); 是一个受保护的构造函数,不能直接实例化 Transform 类。 2.为甚么transform可以访问Tr…

华为数通方向HCIP-DataCom H12-821题库(单选题:281-300)

第281题 OSPF 协议对邻居路由器之间交换的所有数据包都具有认证能力,在VRP系统中,OSPF支持以下哪一种算法? A、DES B、MD5 C、AES D、RSA 答案:B 解析: 在VRP系统中,OSPF协议支持的认证算法是MD5。 第282题 以下关于堆叠拓扑连接方式的描述,错误的是哪一项? A、根…

Meta AI 多语言阅读理解数据集 Belebele

Meta AI 宣布推出一款涵盖 122 种语言变体的多语言阅读理解数据集,名为 Belebele。“我们希望这项工作能够引发围绕 LLM 多语言性的新讨论”。 BELEBELE 是首个跨语言并行数据集,可以直接比较所有语言的模型性能。该数据集涵盖了 29 种脚本和 27 个语系中…

2.4 PE结构:节表详细解析

节表(Section Table)是Windows PE/COFF格式的可执行文件中一个非常重要的数据结构,它记录了各个代码段、数据段、资源段、重定向表等在文件中的位置和大小信息,是操作系统加载文件时根据节表来进行各个段的映射和初始化的重要依据…

百度自研高性能ANN检索引擎,开源了

作者 | Puck项目组 导读 Puck是百度自研的开源ANN检索引擎。Puck开源项目包含两种百度自研的检索算法,以高召回、高准确、高吞吐为目标,适用于多种数据规模和场景。随着业务发展不断的优化和迭代,进行充分的技术开发和测试,确保了…

深入剖析计算机网络和操作系统:面试必备知识解析

深入剖析计算机网络和操作系统的核心概念和面试题,帮助大家全面理解和掌握这两个重要领域的关键知识,为面试做好准备。 计算机网络 什么是TCP拥塞控制?它的目的是什么? TCP拥塞控制是一种机制,用于在网络中控制数据流…

简述电子企业MES管理系统解决方案的实施策略

引言:在电子制造企业中,随着产品种类的增多和订单数量的增长,传统的手工管理方式已经无法满足企业的生产需求。为了提高生产效率,降低成本,提高订单的履行速度和准确性,电子企业需要实施MES管理系统。本文将…