Spring事务的隔离级别

news2024/11/24 8:46:49

事务的特性:

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

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

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

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

相关文章

I2C误码了怎么处理

我相信不少人有遇到I2C设备识别不到&#xff0c;或者概率性误码。 我相信大部分工程师的做法如下&#xff1a; 1.调整上拉电阻的大小&#xff0c;然后重新老化测试&#xff1b; 2.降低I2C速率&#xff0c;然后老化测试&#xff1b; 3.软件加入一定判断条件&#xff0c;将能…

Ncvicat 打开sql文件方法

Nacicat打开sql文件时&#xff0c;有比较多的文章介绍可以直接打开&#xff0c;方法介绍的比较多&#xff0c;但是我遇到了一个坑&#xff0c;就是如何配置环境都无法打开。 本机环境&#xff1a; windows10 mysql 5.7.40 Navicat12.1 一、遇到问题情况 1.1、通过navicat…

Kubernetes向集群外部暴露服务的方式你知道吗?

Kubernetes向进群外暴露服务的方式有三种&#xff1a;Ingress、LoadBlancer类型的Service、NodePort类型的Service。IngressIngress相当于service的service&#xff0c;可以将外部请求通过按照不同规则转发到对应的service。实际上&#xff0c;ingress相当于一个7层的负载均衡器…

面了一个月,终于让我总结出了这份最详细的接口测试面试题

目录 1、你们公司是如何做接口测试的&#xff1f; 2、什么时候开展接⼝测试&#xff1f; 3、接⼝测试和UI测试的工作是否重复&#xff1f; 4、接口测试框架怎么搭建&#xff1f; 5、接⼝之间有依赖时怎么处理&#xff1f; 6、如何判断接⼝测试的结果&#xff08;成功或失败&a…

【C进阶】指针的高级话题

文章目录:star:1. 字符指针:star:2. 指针数组2.1 指针数组的定义2.2 指针数组的使用:star:3. 数组指针3.1 数组的地址3.2 数组指针的使用:star:4. 数组参数和指针参数:star:5. 函数指针5.1 函数名和函数的地址5.2 练习:star:6. 函数指针数组6.1 转移表:star:7. 指向函数指针数组…

昌德科技冲刺上市:计划募资约12亿元,蒋卫和为实控人

近日&#xff0c;深圳市昌德新材科技股份有限公司&#xff08;下称“昌德科技”&#xff09;递交招股书&#xff0c;准备在真真证券交易所主板上市。本次冲刺上市&#xff0c;昌德科技计划募资11.69亿元&#xff0c;中信建投证券为其保荐机构。 据招股书介绍&#xff0c;昌德科…

西电编译原理期末核心考点汇总(期末真题+相关知识点)

文章目录前言一、正规式1.1 相关知识点1.1.1 正规式定义1.1.2 辅助定义1.2 历年真题二、二义文法2.1 相关知识点2.1.1 二义性概念2.2 历年考题三、全部短语、直接短语和句柄3.1 相关知识点3.1.1 短语&#xff0c;直接短语和句柄定义3.1.2 短语&#xff0c;直接短语和句柄例题3.…

【企业管理】研发部视角提出对外支撑业务自助门户构思和实现

导读&#xff1a;公司是由不同部门组成&#xff0c;各个部门之间必然有协同才能使得公司各项职能正常运行。可以说公司的竞争力越强往往会得出公司内部之间工作协同就越高效&#xff0c;可以看出公司各部门之间协同对公司营运是十分重要的。高效协同前提必然是实现便利的信息共…

数据库设计表与表之间的关系详细介绍

文章目录数据库设计数据库设计简介表关系之一对多表关系之多对多表关系之一对一数据库设计 数据库设计简介 软件研发的步骤如下: 设计数据库还是很重要的 数据库设计概念: 数据库设计就是根据业务系统的具体需求&#xff0c;结合我们所选用的DBMS&#xff0c;为这个业务系统构…

Synology搭建Gitea(Docker)

Synology搭建Gitea(Docker) 文章目录Synology搭建Gitea(Docker)参考增加用户与用户组增加映像安装配置反向代理路由器端口转发参考 Nas轻量git方案&#xff1a;Docker安装Gitea;群晖(Synology) NAS 如何安装 gitea 增加用户与用户组 为所有Docer创建一个组docker&#xff1b; 权…

行测-判断推理-图形推理-样式规律-黑白运算

黑白元素个数不同&#xff0c;优先考虑黑白运算白白白黑黑白黑白黑选A考试时&#xff0c;这种题不要先把规律全部推出来&#xff0c;再去做题&#xff0c;太慢了直接看要推的图&#xff0c;通过排除法选答案黑白元素个数不同&#xff0c;优先考虑黑白运算白白白黑黑白黑白黑选B…

【5G RRC】5G系统消息SIB3介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

[python入门(52)] - python中的OS模块(包) - 1

目录 ❤ OS模块和path模块(函数) ❤ 当前路径及路径下的文件 ❤ 绝对路径 ❤ 查看指定文件路径的文件夹路径部分和文件名部分 ❤ 路径拼接 ❤ 获取路径的文件夹路径部分 ❤ 获取路径的文件名 ❤ 查看文件时间 ❤ 查看文件大小 ❤ 查看文件是否存在 ❤ OS模…

【原创】java+swing+mysql设备预约管理系统设计与实现

我们在办公室或者学校实验室的&#xff0c;经常需要使用一些设备&#xff0c;因此需要提前租借。今天我们主要介绍如何使用javaswing和mysql数据库去完成一个设备预约管理系统&#xff0c;方便用户进行设备管理和预约。 功能分析&#xff1a; 设备预约管理系统主要是为了方便…

医疗床头卡(基站方案)

一、产品特色 低功耗&#xff0c;常规使用3-5年电池寿命支持空中唤醒点阵电子纸屏幕安装简单&#xff0c;快速布置远程智能化管理低碳环保&#xff0c;无纸化安全可靠ESL_BWR7.5_V2二、系统结构 三、多基站组织架构 四、电子床头卡 接收路由器发送的数据信息并解析&#xff0…

深度学习之卷积神经网络学习笔记一

1. 引言深度学习是一系列算法的统称&#xff0c;包括卷积神经网络&#xff08;CNN&#xff09;&#xff0c;循环神经网络&#xff08;RNN&#xff09;&#xff0c;自编码器&#xff08;AE&#xff09;&#xff0c;深度置信网络&#xff08;DBN&#xff09;&#xff0c;生成对抗…

FreeRTOS优先级翻转

优先级翻转优先级翻转&#xff1a;高优先级的任务反而慢执行&#xff0c;低优先级的任务反而优先执行优先级翻转在抢占式内核中是非常常见的&#xff0c;但是在实时操作系统中是不允许出现优先级翻转的&#xff0c;因为优先级翻转会破坏任务的预期顺序&#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()定义损失: …

利用Redis一步步实现优惠券的最终秒杀方案

订单ID不能采用自增长的原因&#xff1a; 1、规律变化太明显。两天下单的ID的差值&#xff0c;能够计算出商城的订单量&#xff1b; 2、如果采用自增长&#xff0c;订单数据是会不断产生的&#xff0c;到时候要分表&#xff0c;但是每个表的ID都是从0开始增长的&#xff0c;这…

selenium模块(自动化)

文章目录一、环境配置二、使用selenium解析源码三、基本函数四、子页面&#xff08;ifFrame&#xff09;&#xff08;动作链&#xff0c;拖拽&#xff09;五、实现无可视化界面&#xff0c;规避被检测的风险&#xff08;反反爬&#xff09;六、等待七、异常处理Selenium是自动化…