当前位置: 首页 > news >正文

Spring事务的隔离级别

事务隔离级别解决的是多个事务同时调⽤⼀个数据库的问题

事务传播机制解决的是⼀个事务在多个节点(⽅法)中传递的问题

事务的特性:

隔离性:多个事务在并发执行的时候,多个事务执行的一个行为模式,当一个事务执行的时候,另一个事务执行的一个行为模式是什么?

1)A,原子性,一个事务中的所有操作,要么全部执行成功,要么全部执行失败,要么全部执行,要么全部不执行,不会结束在某一个中间环节,事务在执行的时候发生错误,会被回滚到事务执行之前的状态,就好像这个事务从来没有发生过一样

2)C,一致性在事务开启和事务结束之后,对数据库的完整性没有发生破坏,转账前后,总钱数没有发生变化,张三的钱数和李四钱数在转账前后的总钱数是不会发生改变的;

3)I,持久性,事务处理结束之后,对数据的修改就是持久的,数据永久地被存下来,关机重启之后也不会丢失,系统故障也不会丢失;

4)D,隔离性数据库允许多个并发事务同时对其数据进行读写和修改能力,隔离性可以防止多个事务并发由于交叉执行而导致数据的不一致,事务隔离分为四种级别,多个单个事务同时并发执行的时候,多个事务之间行为模式;

5)而事务的传播机制是指当一个程序调用链里面有多个方法的时候,多个方法进行相互调用的时候,多个方法又有自己的事务的时候,这就是嵌套事务,当程序中出现嵌套事务之后,嵌套事务的行为模式,Spring 事务传播机制定义了多个包含了事务的⽅法,相互调⽤时,事务是如何在这些法间进⾏传递;

一个讲的是列,是事务传播机制

一个讲的是行,是事务隔离级别

6)为什么要设置事务的隔离级别?

设置事务的隔离级别是为了保证多个并发事务执行更可控,更符合操作者预期的,事务的隔离级别就是为了说为了防止其他的事务影响到当前事务执行的一种策略

7)用咱们的CMD连接数据库:mysql -uroot -p(数据库的密码) 数据库名,在客户端执行这个操作就可以进行连接数据库了 

select @@global.tx_isolation,@@tx_isolation,查看当前隔离级别和系统默认隔离级别
@@global.tx_isolation这个就是系统默认的隔离级别,还有咱们的@@tx_isloaction是咱们的当前客户端的默认隔离级别

使用两个客户端来进行演示一下MYSQL的事务的四种隔离级别:

一:脏读问题(读未提交,就开始读):

这个对应MYSQL的隔离级别就是read uncommitted

1)表示读未提交,也叫做未提交读,该隔离级别的事务可以看到其他事务中没有提交的数据,而未提交的数据可能会发生回滚,我们就把一个事务读到别的事务没有提交的数据称之为脏数据因为该事务隔离级别可以看到其他事务没有提交的数据,我们把该隔离级别读到的数据称之为脏数据,把这个问题称之为脏读;

2)这个是指一个事务B读取到了另一个事务A未提交保存的数据,此后这个A事务进行了回滚操作,从而导致了B事务读到了一条不存在的脏数据,此时B事务读到的就是一个中间态的数据,B事务就可能会使用这条脏数据,但是后来A事务直接将事务回滚,该数据就不存在了;

3)我们是可以使用两个MYSQL客户端来进行演示的:

此时我们先将客户端A的事务隔离级别设置成读未提交,而B的客户端的默认隔离级别是系统默认的隔离级别:

执行客户端A客户端B
1set session transaction isolation level read uncommited
2start transaction
3start transaction
4insert into city values("西安")
5select * from city(此时我们读到一条数据,这个数据就是脏数据)
6rollback
7select * from city 啥也读不到

我们发现在我们的事务B新增数据进行完成回滚操作之后,我们的客户端A在进行我们此时在city表中是无法进行查询到任何数据的;

二)不可重复读问题(写完了读,读已提交):

但是从我的理解角度来说,同一个时间段不同的查询得到了不同的结果,但是读到的数据都是真实的在磁盘的上面进行修改了

2.1)这个时候一个事务不可以看到另一个事务未提交的数据了但是可以看到其他事务提交的结果,A事务和B事务在执行的时候,B未提交的数据A是看不到的;

2.2)我们在同一个事务中,同一个查询在不同的时间段内得到了不同的结果,假设咱们的事务在T1的时候读取到了某一行数据,我们在T2时间内再次重新读取到这一行的时候,这一行的数据我们发现此时已经被其他事务修改了;

执行客户端A客户端B
1set session transaction isolation level readcommited
2
3select * from city(查询到的是西安的数据)
4

start transaction

5

执行SQL语句:

update city set name="长安" where name="西安“

6commit
7select * from city(此时我们读到的数据是长安)

我们从上述结果中我们发现,客户端A被设置成了读已提交的事务隔离级别之后,使用相同的SQL两次进行读取到的同一条数据,内容是不一样的,这就是不可重复读,主要是针对修改操作来说的,在事务1读取的过程中可以读到其他事务提交的结果;

总结:该隔离级别的事务能读到已经提交事务的数据,因此他不会出现脏读问题,但是在事务执行的过程中可以读到其他事务提交的结果,所以在不同的时间的相同的SQL查询的时候,可能会得到不同的结果;

三:幻读问题:同一个查询在不同时间内出现了不同的结果

1)这就是事务中的幻读问题,咱们举个例子来说,当我们开启事务之后,我们执行第一次select,我们进行查询出来了一条语句,就类似于幻觉;

2)但是当我们再次执行第二次Select查询之后,我们查询到了两行,第二次返回了第一次的·select查询没有进行返回的一行,这一行就类似于幻想行,下面我们举个例子来理解一下:

步骤        客户端A客户端B
1set session transaction isolaction level repeatable read
2start transaction
3select * from city where id<5
4start transaction
5insert into city city(id,name) values(2,北京);
6commit
7update city set name="京城” where id=2
8select * from city where id<5

从上述执行流程来看,我们最后一条查询语句,查出了两条数据,客户端A一开始就设置了可重复读的事务隔离级别之后,使用相同的SQL却查询出来了不一样的结果,第一次查询出了一条数据,第二行却查询出了两条数据,多出来的这条数据就叫做幻象行,所以说在可重复读的情况下可能会出现幻读的问题;

最后总结:

1)脏读是读到了其他事务未提交的数据,不可重复读和幻读是已经读到了其他事务提交修改的数据,不可重复读是读到了其他事务修改的数据;

2)但是幻读是读取到了其他事务新增或者删除的幻象行数据;

3)幻读和不可重读描述的侧重点是不一样的,幻读描述的是新增或者删除操作,不可重复读描述的是修改操作的,会强制事务进行排序;

咱们Spring的事务隔离级别:解决的是多个事务共同调用数据库的问题

需要进行事务的隔离级别只需要进行设置@Transaction里面的isolation属性即可

@Transactional(isolation = Isolation.DEFAULT,timeout =60)

1)Isolation.DEFAULT:以连接的数据库的事务隔离级别为主,使用链接的对应数据库的隔离级别,如果使用MYSQL,那么事务隔离级别就是read committed;

2)Isolation.READ_UNCOMMITTED:读未提交,可以读到未提交的事务,是存在脏读的;

3)Isolation.READ_COMMITTED:读已经提交,只能读取到已经提交的事务,解决了脏读,但是还是存在着不可重复读的问题;

4)Isolation.REPEATABLE_READ:可重复读,解决了不可重复读的问题,但存在着幻读,这是MYSQL的一个默认隔离级别;

5)Isolation.SERIALIZABLE:这是串行化,可以解决所有的并发问题,但是性能太低,所有事务来了,串行执行,一个一个执行,直接就没有并发事务;

注意:

1)当Spring中设置了事务隔离级别和连接的数据库事务的隔离级别的发生冲突的时候,那么以Spring事务隔离级别为准;

2)当Spring中的事务隔离级别的实现是依靠连接数据库支持事务隔离级别的基础,比如说MYSQL5.1引擎是MYSIMMYSQL5.1默认时是不支持事务和事务隔离级别的时候,当MYSQL使用不支持事务的存储引擎的时候所以在程序里面是不支持事务和事务隔离级别的;

3)设置当前客户端的隔离级别:set session transaction isolation level +隔离级别;

1)可重复读:它能确保同一事务多次查询的结果一致,但也会有新的问题,比如此级别的事务正在执行时,另一个事务成功的插入了某条数据,但它每次查询的结果都是一样的,因为他已经解决了不可重复读的问题,虽然原有数据没有被修改,但是新增或者减少了数据;

2)所以会导致查询不到这条数据,自己重复插入时又失败,因为唯一约束的原因,明明在事务中查询不到这条信息,但自己就是插入不进去,这就叫幻读

3)串行化:会强制事务排序,使之不会发生冲突,从而解决了脏读、不可重复读和幻读问题,但因为执行效率低,所以真正使用的场景并不多;

事务传播机制:

1)当有多个嵌套事务的时候,多个嵌套事务之间的行为模式,我是把所有小的事务当成一个大的事务,还是各自为正,还是一个方法有事务,一个方法没有事务,到底最终加不加事务,当有多个方法嵌套调用的时候,多个方法的行为模式;

2)当一个程序里面有多个方法的时候,多个方法在相互调用的时候,多个方法又同时有事务的时候,多个事务在相互调用的时候的一个行为模式

相关文章:

Spring事务的隔离级别

事务隔离级别解决的是多个事务同时调⽤⼀个数据库的问题 事务传播机制解决的是⼀个事务在多个节点(⽅法)中传递的问题 事务的特性: 隔离性:多个事务在并发执行的时候&#xff0c;多个事务执行的一个行为模式&#xff0c;当一个事务执行的时候&#xff0c;另一个事务执行的一个行…...

JVM系统优化实践(4):以支付系统为例

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e;前面说过&#xff0c;JVM会将堆内存划分为年轻代、老年代两个区域。年轻代会将创建和使用完之后马上就要回收的对象放在里面&#xff0c;而老年代则将创建之后需要…...

16- TensorFlow实现线性回归和逻辑回归 (TensorFlow系列) (深度学习)

知识要点 线性回归要点: 生成线性数据: x np.linspace(0, 10, 20) np.random.rand(20)画点图: plt.scatter(x, y)TensorFlow定义变量: w tf.Variable(np.random.randn() * 0.02)tensor 转换为 numpy数组: b.numpy()定义优化器: optimizer tf.optimizers.SGD()定义损失: …...

无自动化测试系统设计方法论

灵活 敏捷 迭代。 自动化测试 辩思 测试必不可少 想想看没有充分测试的代码, 哪一次是一次过的? 哪一次不需要经历下测试的鞭挞? 不要以为软件代码容易改, 就对于质量不切实际的自信—那是自大! 不适用自动化测试的case 遗留系统。太多的依赖方, 不想用过多的mock > …...

架构初探-学习笔记

1 什么是架构 有关软件整体结构与组件的抽象描述&#xff0c;用于指导软件系统各个方面的设计。 1.1 单机架构 所有功能都实现在一个进程里&#xff0c;并部署在一台机器上。 1.2 单体架构 分布式部署单机架构 1.3 垂直应用架构 按应用垂直切分的单体架构 1.4 SOA架构 将…...

在成都想转行IT,选择什么专业比较好?

很多创新型的互联网服务公司的核心其实都是软件&#xff0c;创新的基础、运行的支撑都是软件。例如&#xff0c;软件应用到了出租车行业&#xff0c;就形成了巅覆行业的滴滴;软件应用到了金融领域&#xff0c;就形成互联网金融;软件运用到餐饮行业&#xff0c;就形成美团;软件运…...

【Spark分布式内存计算框架——Spark Streaming】4.入门案例(下)Streaming 工作原理

2.3 Streaming 工作原理 SparkStreaming处理流式数据时&#xff0c;按照时间间隔划分数据为微批次&#xff08;Micro-Batch&#xff09;&#xff0c;每批次数据当做RDD&#xff0c;再进行处理分析。 以上述词频统计WordCount程序为例&#xff0c;讲解Streaming工作原理。 创…...

2、算法先导---思维能力与工具

题目 碎纸片的拼接复原(2013B) 内容 破碎文件的拼接在司法物证复原、历史文献修复以及军事情报获取等领域都有着重要的应用。传统上&#xff0c;拼接复原工作需由人工完成&#xff0c;准确率较高&#xff0c;但效率很低。特别是当碎片数量巨大&#xff0c;人工拼接很难在短时…...

WordPress 函数:add_theme_support() 开启主题自定义功能(全面)

add_theme_support() 用于在我们的当前使用的主题添加一些特殊的功能&#xff0c;函数一般写在主题的functions.php文件中&#xff0c;当然也可以再插件中使用钩子来调用该函数&#xff0c;如果是挂在钩子上&#xff0c;那他必须挂在after_setup_theme钩子上&#xff0c;因为 i…...

Winform控件开发(16)——Timer(史上最全)

前言: Timer控件的作用是按用户定义的时间间隔引发事件的计时器,说的直白点就是,他就像一个定时炸弹一样到了一定时间就爆炸一次,区别在于定时炸弹炸完了就不会再次爆炸了,但是Timer这个计时器到了下一个固定时间还会触发一次,上面那张图片就是一个典型的计时器,该定时器…...

游戏高度可配置化:通用数据引擎(data-e)及其在模块化游戏开发中的应用构想图解

游戏高度可配置化&#xff1a;通数据引擎在模块化游戏开发中的应用构想图解 ygluu 码客 卢益贵 目录 一、前言 二、模块化与插件 1、常规模块化 2、插件式模块化&#xff08;插件开发&#xff09; 三、通用数据引擎理论与构成 1、名字系统&#xff08;数据类型&#xf…...

CountDownLatch与CyclicBarrier原理剖析

1.CountDownLatch 1.1 什么是CountDownLatch CountDownLatch是一个同步工具类&#xff0c;用来协调多个线程之间的同步&#xff0c;或者说起到线程之间的通信&#xff08;而不是用作互斥的作用&#xff09;。 CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之…...

NLP中的对话机器人——预训练基准模型

引言 本文是七月在线《NLP中的对话机器人》的视频笔记&#xff0c;主要介绍FAQ问答型聊天机器人的实现。 场景二 上篇文章中我们解决了给定一个问题和一些回答&#xff0c;从中找到最佳回答的任务。 在场景二中&#xff0c;我们来实现&#xff1a; 给定新问题&#xff0c;从…...

C语言学习及复习笔记-【14】C文件读写

14 C文件读写 14.1打开文件 您可以使用 fopen( ) 函数来创建一个新的文件或者打开一个已有的文件&#xff0c;这个调用会初始化类型 FILE 的一个对象&#xff0c;类型 FILE包含了所有用来控制流的必要的信息。下面是这个函数调用的原型&#xff1a; FILE *fopen( const char…...

模拟退火算法优化灰色

clc; clear; close all; warning off; %% tic T01000; % 初始温度 Tend1e-3; % 终止温度 L200; % 各温度下的迭代次数&#xff08;链长&#xff09; q0.9; %降温速率 X[16.4700 96.1000 16.4700 94.4400 20.0900 92.5400 22.3900 93.3700 25.…...

Pandas怎么添加数据列删除列

Pandas怎么添加数据列 1、直接赋值 # 1、直接赋值df.loc[:, "最高气温"] df["最高气温"].str.replace("℃", "").astype("int32")df.loc[:, "最低气温"] df["最低气温"].str.replace("℃"…...

C++类和对象:构造函数和析构函数

目录 一. 类的六个默认成员函数 二. 构造函数 2.1 什么是构造函数 2.2 编译器自动生成的默认构造函数 2.3 构造函数的特性总结 三. 析构函数 3.1 什么是析构函数 3.2 编译器自动生成的析构函数 3.3 析构函数的特性总结 一. 类的六个默认成员函数 对于任意一个C类&…...

【Stata】从入门到精通.零基础小白必学的教程,一学就fei

视频教程移步&#xff1a;https://www.bilibili.com/video/BV1hK4y1d714/?p4&spm_id_frompageDriver&vd_sourcecc8074e9c81a225f214226065db53d32P3 第二讲 Stata处理数据全流程&#xff08;上&#xff09; P3 - 01:37&#xfeff;内置数据 file example datasets使用…...

【RuoYi优化】调整JVM启动内存

📔 笔记介绍 大家好,千寻简笔记是一套全部开源的企业开发问题记录,毫无保留给个人及企业免费使用,我是作者星辰,笔记内容整理并发布,内容有误请指出,笔记源码已开源,前往Gitee搜索《chihiro-notes》,感谢您的阅读和关注。 作者各大平台直链: GitHub | Gitee | CSD…...

[架构模型]MVC模型详细介绍,并应用到unity中

简介&#xff1a; MVC模式是一种软件架构模式&#xff0c;它将应用程序分为三个主要部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controller&#xff09;。MVC模式的目标是实现应用程序的松耦合&#xff0c;以便…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...