【笔记】事务隔离级别以及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

相关文章

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

springboot报错Invalid bound statement (not found)的解决

《springboot报错Invalidboundstatement(notfound)的解决》本文主要介绍了springboot报错Invalidboundstatement(not... 目录一. 问题描述二.解决问题三. 添加配置项 四.其他的解决方案4.1 Mapper 接口与 XML 文件不匹配

Python中ModuleNotFoundError: No module named ‘timm’的错误解决

《Python中ModuleNotFoundError:Nomodulenamed‘timm’的错误解决》本文主要介绍了Python中ModuleNotFoundError:Nomodulen... 目录一、引言二、错误原因分析三、解决办法1.安装timm模块2. 检查python环境3. 解决安装路径问题

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

如何解决Spring MVC中响应乱码问题

《如何解决SpringMVC中响应乱码问题》:本文主要介绍如何解决SpringMVC中响应乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC最新响应中乱码解决方式以前的解决办法这是比较通用的一种方法总结Spring MVC最新响应中乱码解

Java报NoClassDefFoundError异常的原因及解决

《Java报NoClassDefFoundError异常的原因及解决》在Java开发过程中,java.lang.NoClassDefFoundError是一个令人头疼的运行时错误,本文将深入探讨这一问... 目录一、问题分析二、报错原因三、解决思路四、常见场景及原因五、深入解决思路六、预http://www

pip无法安装osgeo失败的问题解决

《pip无法安装osgeo失败的问题解决》本文主要介绍了pip无法安装osgeo失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 进入官方提供的扩展包下载网站寻找版本适配的whl文件注意:要选择cp(python版本)和你py

SpringBoot项目启动报错"找不到或无法加载主类"的解决方法

《SpringBoot项目启动报错找不到或无法加载主类的解决方法》在使用IntelliJIDEA开发基于SpringBoot框架的Java程序时,可能会出现找不到或无法加载主类com.example.... 目录一、问题描述二、排查过程三、解决方案一、问题描述在使用 IntelliJ IDEA 开发基于