【笔记】事务隔离级别以及MVCC解决幻读

2024-06-24 05:20

本文主要是介绍【笔记】事务隔离级别以及MVCC解决幻读,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

事务提交可能碰到的问题:
(1)脏读:事务1对数据进行修改但还没提交,事务2读取修改后的数据,之后事务1执行错误,回滚了,此时事务2的数据是错误的脏数据
(2)不可重复读:事务1读取数据1后,事务2对数据1进行修改,之后事务1的再次读取数据1时,发现前后读取结果不一致
(3)幻读:事务1根据条件查询到一批数据后,事务2删除或增加或修改了某些数据,之后事务1再次根据条件查询,发现读取的数据数量不对了

事务隔离级别:数据库中事务之间的隔离程度
数据库提供了四种事务隔离级别:

  • 读未提交(RU, Read Uncommitted):指一个事务还没提交时,它做的变更就能被其他事务看到;
  • 读已提交(RC, Read Committed):指一个事务提交之后,它做的变更才能被其他事务看到,解决了脏读
  • 可重复读(RR, Repeatable Read):指一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,解决了脏读和不可重复读.(MySQL InnoDB 引擎的默认隔离级别)
  • 串行化(Serializable ):对记录加上读写锁

在这里插入图片描述
从上到下,控制程度越来越高,并发处理能力越来越低,但安全性更高
RU:啥问题都有,一般不用
Serializable: 加锁,解决全部问题,不用操心,就是并发处理能力比较低
在RC级别下如何解决不可重复读和幻读?
方法:用MVCC解决,但无法完全避免幻读
MVCC(多版本并发控制):数据库中同时存在多个版本的数据,一个版本是一张快照(ReadView文件),它们通过版本链连接,版本链的头节点代表当前记录的最新值。
这样,在一个事务中,如果需要读取数据,就可以直接读取版本链中适合自己的版本,从而实现非锁定读取,解决了不可重复读问题,也一定程度上减少了幻读的发生。
在RR级别下如何解决幻读?
方法:MVCC+间隙锁
间隙锁是一种锁定记录之间 间隙的锁,间隙锁和行锁合称 next-key lock, 每个next-key lock是前开后闭的区间.(比如间隙锁(0,5)+行锁[5]的锁定区间是(0,5]) ,初始化插入6 个记录会产生 7 个间隙,如下图所示:
在这里插入图片描述
不仅给事务加了行锁,还给行前后的间隙加了间隙锁,当另一个事务尝试在一个已经被锁定的间隙插入新的记录时,会被阻塞,从而避免了幻读问题。
当前读和快照读
快照读:读取数据时获取某一时刻的快照,普通的select查询语句是快照读
当前读:读取最新的数据,就是执行下列语句时进行数据读取的方式
insert、Update、Delete、Select…for update(写锁)、Select…lock in share mode(读锁)

RC级别时MVCC在每一次select时都重新生成快照数据,快照数据依据版本数据链条的头部最新数据产生。
RR级别时只在第一次读取数据时生成一个ReadView,后面会复用第一次生成的。

这篇关于【笔记】事务隔离级别以及MVCC解决幻读的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1089276

相关文章

SpringBoot日志级别与日志分组详解

《SpringBoot日志级别与日志分组详解》文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或... 目录日志级别1、级别内容2、调整日志级别调整默认日志级别调整指定类的日志级别项目开发过程中,利用日志

Spring 中的切面与事务结合使用完整示例

《Spring中的切面与事务结合使用完整示例》本文给大家介绍Spring中的切面与事务结合使用完整示例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录 一、前置知识:Spring AOP 与 事务的关系 事务本质上就是一个“切面”二、核心组件三、完

504 Gateway Timeout网关超时的根源及完美解决方法

《504GatewayTimeout网关超时的根源及完美解决方法》在日常开发和运维过程中,504GatewayTimeout错误是常见的网络问题之一,尤其是在使用反向代理(如Nginx)或... 目录引言为什么会出现 504 错误?1. 探索 504 Gateway Timeout 错误的根源 1.1 后端

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

SysMain服务可以关吗? 解决SysMain服务导致的高CPU使用率问题

《SysMain服务可以关吗?解决SysMain服务导致的高CPU使用率问题》SysMain服务是超级预读取,该服务会记录您打开应用程序的模式,并预先将它们加载到内存中以节省时间,但它可能占用大量... 在使用电脑的过程中,CPU使用率居高不下是许多用户都遇到过的问题,其中名为SysMain的服务往往是罪魁

MySQ中出现幻读问题的解决过程

《MySQ中出现幻读问题的解决过程》文章解析MySQLInnoDB通过MVCC与间隙锁机制在可重复读隔离级别下解决幻读,确保事务一致性,同时指出性能影响及乐观锁等替代方案,帮助开发者优化数据库应用... 目录一、幻读的准确定义与核心特征幻读 vs 不可重复读二、mysql隔离级别深度解析各隔离级别的实现差异

Java报错:org.springframework.beans.factory.BeanCreationException的五种解决方法

《Java报错:org.springframework.beans.factory.BeanCreationException的五种解决方法》本文解析Spring框架中BeanCreationExce... 目录引言一、问题描述1.1 报错示例假设我们有一个简单的Java类,代表一个用户信息的实体类:然后,