Spring事务的隔离级别

使用事务隔离级别可以控制并发事务在同时执行时的某种行为。

前言:

在学习Spring事务隔离级别前我们先了解一下什么是脏读,幻读,不可重复读。

脏读:

一个事务读到另一个事务未提交的更新数据,所谓脏读,就是指事务A读到了事务B还没有提交的数据,比如银行取钱,事务A开启事务,此时切换到事务B,事务B开启事务->取走100元,此时切换回事务A,事务A读取的肯定是数据库里面的原始数据,因为事务B取走了100块钱,井没有提交,数据库里面的账务余额街定还是原始余额,这就是脏读。

幻读:

是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么。以后就会发生操作第一个重务的用户发现表中还有没有修改的数据行,就好像发生了幻觉一样。

不可重复的:

在一个事务里面的操作中发现了未被操作的效据 比如说在同一个事务中先后执行两条一横一样的select语句,明间在此次亚务中没有执行过任何DDL语句,但先后得到的结果不一教,这就是不可重复读。

一、DEFAULT(默认的事务隔离级别)

使用当前数据的默认隔离级别,MySql默认采用可重复读隔离级别,Oracle默认采用读已提交隔离级别。

二、READ_UNCOMMITTED(读未提交)

最低的隔离级别,允许读取尚未提交的数据变更,就是上面提到的脏读。

这种隔离级别可能导致脏读,幻读,不可重复读。

三、READ_COMMITTED(读已提交)

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

这种隔离级别可能阻止脏读,但是幻读和不可重复读仍有可能发生。

四、REPEATABLE_READ(可重复读)

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

这种隔离级别可能阻止脏读和不可重复读,但是幻读仍有可能发生。

五、SERIALIZABLE(串行化)

最高的事务隔离级别,完全服从ACID的隔离级别,它会强制事务排序,所有事务依次逐个执行,使之不会发生冲突,从而解决了脏读、不可重复读和幻读问题,但因为执行效率低,严重影响系统性能,所以真正使用的场景并不多。

这种隔离级别可能阻止脏读,幻读和不可重复读。

相关推荐
weixin199701080162 分钟前
【保姆级教程】淘宝/天猫商品详情 API(item_get)接入指南:Python/Java/PHP 调用示例与 JSON 返回值解析
java·python·php
环流_10 分钟前
redis核心数据类型在java中的操作
java·数据库·redis
雨辰AI16 分钟前
SpringBoot3 项目国产化改造完整流程|从 MySQL 到人大金仓落地
java·数据库·后端·mysql·政务
一个天蝎座 白勺 程序猿18 分钟前
存储治理:表空间自动目录创建与国产操作系统生态适配
数据库·kingbasees
带刺的坐椅20 分钟前
Java 流程编排新范式 Solon Flow:一个引擎,七种节点,覆盖规则/任务/工作流/AI 编排全场景
java·spring·ai·solon·flow
2401_8844541526 分钟前
mysql处理复杂SQL性能_InnoDB优化器与MyISAM差异
jvm·数据库·python
知彼解己44 分钟前
Arthas:Java生产环境问题排查利器,从入门到实战
java
weelinking1 小时前
【企业级】企业级大模型合规实战:数据安全与跨境传输的技术解决方案
数据库·人工智能·机器学习·云计算·github
m0_470857641 小时前
golang如何实现目录大小统计_golang目录大小统计实现方案
jvm·数据库·python
xiaoshuaishuai81 小时前
C# CDN加速与离线包优化PowerSetting慢问题
开发语言·windows·spring·c#