当前位置: 首页 > 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;以便…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...