spring 事务隔离级别

一、理解 脏读、不可重复读和幻读

脏读、不可重复读和幻读是数据库事务处理中可能出现的三种并发问题,它们都与事务的隔离性有关。下面是这三种现象的简要说明:

1. 脏读(Dirty Read):

        当一个事务读取了另一个事务尚未提交的更改数据时,就会发生脏读。如果后者最终回滚了事务,那么前者读取的数据实际上是无效的,即“脏”的。脏读破坏了事务的隔离性,因为它允许一个事务查看到未确定的中间状态数据。

2. 不可重复读(Non-repeatable Read):

        不可重复读发生在同一个事务中,当用户对同一数据进行两次或更多次查询时,由于其他并发事务对数据进行了修改并提交,导致后一次查询的结果与前一次不同。换句话说,就是事务内部无法重复获取到之前读取过的相同数据,这违反了事务的一致性要求。

3. 幻读(Phantom Read):

        幻读通常涉及到插入或删除操作。在一个事务内,用户执行两次相同的查询,第二次查询时发现多出了原本不存在的记录(幻象记录),这是因为在两次查询之间,有其他事务插入了新的数据。或者,第一次查询时存在的某些记录,在第二次查询时因其他事务的删除操作而消失。幻读关注的是查询结果集中行的数量变化,而不是数据本身的变化。

为了解决这些问题,数据库管理系统提供了不同的事务隔离级别,包括READ UNCOMMITTED(允许所有上述问题)、READ COMMITTED(解决了脏读问题)、REPEATABLE READ(进一步解决了不可重复读问题)和SERIALIZABLE(最严格,解决了所有三种问题,但可能牺牲性能)。不同的应用场景可能会根据实际需求选择不同的隔离级别来平衡一致性和性能。

二、事务隔离级别

在Spring框架中,事务隔离是指在多个并发事务之间设置的边界,以防止它们相互影响,确保数据的一致性和完整性。Spring支持数据库系统定义的四种标准的事务隔离级别,以及一个默认级别。以下是这五种级别的概述:

1. Isolation.DEFAULT(默认):

        这是Spring特有的一个级别,它意味着事务的隔离级别将由底层数据库系统决定。每个数据库都有自己的默认隔离级别,例如MySQL的默认隔离级别是REPEATABLE_READ,而Oracle的默认级别是READ_COMMITTED。

2. Isolation.READ_UNCOMMITTED(读未提交):

        这是最宽松的隔离级别,允许脏读、不可重复读和幻读。在这种级别下,一个事务可以读取另一个未提交事务的数据。

3. Isolation.READ_COMMITTED(读已提交):

        防止了脏读,但允许不可重复读和幻读。在这个级别,一个事务只能看到其他事务已经提交的修改。

4. Isolation.REPEATABLE_READ(可重复读):

        防止了脏读和不可重复读,但允许幻读。在这个级别,一个事务在整个事务期间可以看到相同的数据多次,即使其他事务在这期间对数据进行了修改。

5. Isolation.SERIALIZABLE(序列化):

        这是最严格的隔离级别,它可以防止脏读、不可重复读和幻读。在序列化隔离级别下,事务如同按照顺序执行一样,但代价是性能降低,因为需要锁定所有读取的行。

在Spring中,你可以通过@Transactional注解来设置事务的隔离级别,例如:

@Transactional(isolation = Isolation.READ_COMMITTED)
public void someServiceMethod() {// 事务内的代码
}

或者在XML配置中设置:

<tx:advice id="transactionAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="someServiceMethod" isolation="READ_COMMITTED" /></tx:attributes>
</tx:advice>

选择合适的隔离级别取决于你的应用程序的需求和性能考虑。通常,READ_COMMITTED是一个平衡性能和并发控制的常见选择,而SERIALIZABLE虽然最安全,但可能导致更多的锁竞争和死锁。

三、事务传播和事务隔离级别关联性:

1. 虽然两者是独立的概念,但它们共同确保了事务的正确性和一致性。事务传播定义了事务的边界和嵌套关系,而事务隔离级别则确保在这些边界内的数据一致性

2. 在实际应用中,根据业务需求和性能考虑,结合使用不同的事务传播行为和隔离级别。例如,对于需要确保数据一致性的关键操作,可能会选择较高的隔离级别,并使用PROPAGATION_REQUIRES_NEW来确保该操作在一个独立的事务中执行,不受外部事务影响。

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

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

相关文章

【Python】pandas中的read_excel()和to_excel()函数解析与代码实现

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 &#x1f913; 同时欢迎大家关注其他专栏&#xff0c;我将分享Web前后端开发、人工智能、机器学习、深…

类和对象的学习总结(一)

面向对象和面向过程编程初步认识 C语言是面向过程的&#xff0c;关注过程&#xff08;分析求解问题的步骤&#xff09; 例如&#xff1a;外卖&#xff0c;关注点菜&#xff0c;接单&#xff0c;送单等 C是面向对象的&#xff0c;关注对象&#xff0c;把一件事拆分成不同的对象&…

java之面向对象2笔记

1 接口(interface) 1.1 概述 接口&#xff08;Interface&#xff09;在计算机科学中&#xff0c;特别是在面向对象编程&#xff08;OOP&#xff09;中&#xff0c;是一个重要的概念。它定义了一组方法的规范&#xff0c;但没有实现这些方法的具体代码。接口的主要目的是确保类…

[240610] 5 种 Non-Posix Shell 在 x-cmd 上的支持 | Perl 发布 5.40.0

目录 [TOC](目录)5 种非 Posix SHell - nushell,fish,xonsh,csh,pwshnushellfishxonshcshpwsh Perl 发布 5.40.0核心增强安全性不兼容的变化弃用性能提升模块和编译指示文档诊断配置和编译平台支持内部变化选定的错误修复已知问题先前版本的勘误表致谢报告错误致谢另请参阅 5 种…

SOA的设计模式_3.微服务模式

SOA的架构中&#xff0c;复杂的ESB企业服务总线依然处于非常重要的位置&#xff0c;整个系统的架构并没有实现完全的组件化以及面向服务&#xff0c;它的学习和使用门槛依然偏高。而微服务不再强调传统SOA架构里面比较重的ESB企业服务总线&#xff0c;同时SOA的思想进入到单个业…

Linux系统下 安装 Nginx

一、下载Nginx安装包 压缩包下载地址&#xff1a;nginx: download 服务器有外网&#xff0c;可直接使用命令下载 wget -c https://nginx.org/download/nginx-1.24.0.tar.gz 二、安装Nginx 1、解压 tar -zxvf nginx-1.24.0.tar.gz 2、安装Nginx所需依赖 yum install -y gc…

整数反转(leetcode)

题目&#xff1a; 给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] &#xff0c;就返回 0。 假设环境不允许存储 64 位整数&#xff08;有符号或无符号&#xff09;。 示例 1&…

SLAM小题目

1、最小二乘题目&#xff1a; 假设有三个WIFI热点&#xff0c;位置分别在(x1,y1), (x2,y2), (x3,y3), 移动端测量到每一个热点的距离L1,L2和L3&#xff0c;要求解移动端的位置. #include <iostream> #include <vector> #include <cmath> class Point { pub…

监听DB配置变更之go-broadcast简单实现

文章目录 1. 前言2. 分析3. 实现4. 问题5. 小结6. 参考 1. 前言 之前遇到一个需求&#xff0c;因为配置的查找是基于db的&#xff0c;而db的更改却无法实时通知到具体利用到这条数据的使用方&#xff0c;为了实现db数据变动时&#xff0c;能够尽快让使用方知道这条数据发生了变…

设计模式七大原则-单一职责原则SingleResponsibility

七大原则是在设计“设计模式”的时候需要用到的原则&#xff0c;它们的存在是为了保证设计模式达到以下几种目的&#xff1a; 1.代码重用性 2.可读性 3.可拓展性 4.可靠性&#xff08;增加新的功能后&#xff0c;对原来的功能没有影响&#xff09; 5.使程序呈现高内聚、低耦合的…

3、线性代数

1、矩阵转置 A[i,j]A[j,i] 2、对称矩阵 &#xff1a;A转置A [0,2,3] [2 1 5] [3,5,1] 3、三维矩阵 求和 axis0 两个矩阵相加 axis1 两个向量相加 &#xff0c;axis2 向量内部相加 keepdimsTrue 求和后维度保持不变 4、cumsum累加求和 5、torch.mm() 或 torch.bmm() 【矩…

vivado HW_SERVER

HW_服务器 描述 硬件服务器管理到硬件目标的连接&#xff0c;例如硬件 板&#xff0c;包含一个或多个Xilinx FPGA设备的JTAG链&#xff0c;用于 编程和调试您的FPGA设计。 使用open_hw命令打开硬件管理器时&#xff0c;可以连接到 硬件服务器&#xff0c;本地或远程&#xff0c…

支持YUV和RGB格式两路视频同时播放

1.头文件&#xff1a; sdlqtrgb.h #pragma once #include <QtWidgets/QWidget> #include "ui_sdlqtrgb.h" #include <thread> class SdlQtRGB : public QWidget {Q_OBJECTpublic:SdlQtRGB(QWidget* parent Q_NULLPTR);~SdlQtRGB(){is_exit_ true;//等…

使用EFCore和Linq查询语句封装复杂的查询结果

这里举一个例子&#xff0c;用到了三个实体类&#xff0c;分别是 [Table("t_user")] public class User {[Key]public long Id { get; set; }public string UserName { get; set; }public string Password { get; set; }public string Email { get; set; }public Li…

Gradle和Maven都是广泛使用的项目自动化构建工具(二)

Gradle和Maven都是广泛使用的项目自动化构建工具&#xff0c;但它们在多个方面存在差异。以下是关于Gradle和Maven的详细对比&#xff1a; 一、构建脚本语言 Maven&#xff1a;使用XML作为构建脚本语言。XML的语法较为繁琐&#xff0c;不够灵活&#xff0c;对于复杂的构建逻辑…

十大排序

本文将以「 通俗易懂」的方式来描述排序的基本实现。 &#x1f9d1;‍&#x1f4bb;阅读本文前&#xff0c;需要一点点编程基础和一点点数据结构知识 本文的所有代码以cpp实现 文章目录 排序的定义 插入排序 ⭐ &#x1f9d0;算法描述 &#x1f496;具体实现 &#x1f…

LabVIEW硬件与仿真双模式设计液压系统

在实际项目中&#xff0c;结合LabVIEW与液压运动控制器&#xff0c;通过设计两种运行方式&#xff1a;硬件运行和仿真运行&#xff0c;使得系统既能进行实际操作又能进行仿真测试。此设计不仅方便了开发调试&#xff0c;也为教学培训和展示提供了极大的便利。本文将从项目背景、…

OBS与直播伴侣是什么关系,是否需要并用?

OBS相较于直播伴侣&#xff0c;提供了更为丰富和灵活的直播功能。OBS是一个免费开源的视频录制和视频实时交流软件&#xff0c;具有以下优势&#xff1a; 优化直播画面&#xff1a;OBS提供了包括卡通头像、卡通人物&#xff0c;以及美颜、特效、滤镜等多种功能&#xff0c;可以…

力扣2300.咒语和药水的成功对数

力扣2300.咒语和药水的成功对数 排序 二分 对于能整除的数 -1以后一起处理可以在原数组直接修改 class Solution {public:vector<int> successfulPairs(vector<int>& spells, vector<int>& potions, long long success) {sort(potions.begin(),p…

【机器学习】基于卷积LSTM的视频预测

1. 引言 1.1 LSTM是什么 LSTM&#xff08;Long Short-Term Memory&#xff09;是一种特殊的循环神经网络&#xff08;RNN&#xff09;变体&#xff0c;旨在解决传统RNN在处理长序列数据时遇到的梯度消失和梯度爆炸问题。LSTM通过引入门控机制和细胞状态的概念&#xff0c;使得…