面试之可重复读是否可以解决幻读

news/2025/1/11 6:57:36/

可重复读(repeatable read)定义:一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据时是一致的。

不过理论上 是会出现幻读的,简单的来说幻读指的是当用户读取某一范围的数据行时,另外一个事务又在该范围插入了新行,当用户再次读取该范围的数据时会发现 出现新的幻影行。

注意可重复读隔离级别下,普通的查询是快照读,是不会看到别的事物插入的数据的。因此,当前在”当前读“下才会出现 幻读。

在mvcc并发控制中,读操作可以分为两类:快照读 和当前读。

快照读:

快照读 :是 在读取的数据 时 不是读取最新版本的数据。而是基于历史版本读取的一个快照信息(mysql 读取 undo log 历史版本),快照读可以使用普通的select 读取时不用在对表数据 及逆行加锁,从而解决了因为数据库表的加锁而导致的两个问题

1:解决了因加锁导致的修改数据时无法对胡数据读取问题

2:解决了因加锁导致读取数据时无法对进行修改的问题。

当前读:读取的数据最新的数据,当前读和快照读不同,因为读取最新的数据而且保证事务的隔离性,所以当前读 是需要对数据进行加锁的。

下面举个列子:

表结构

idkeyvalue
000
111

假设 select * from where value=1 for update,只在这一行加锁(注意这只是假设),其它行不加锁,那么就会出现如下场景:

image.png

Session A的三次查询Q1-Q3都是select * from where value=1 for update,查询的value=1的所有row。

  • T1:Q1只返回一行(1,1,1);

  • T2:session B更新id=0的value为1,此时表t中value=1的数据有两行

  • T3:Q2返回两行(0,0,1),(1,1,1)

  • T4:session C插入一行(6,6,1),此时表t中value=1的数据有三行

  • T5:Q3返回三行(0,0,1),(1,1,1),(6,6,1)

  • T6:session A事物commit。

其中Q3读到value=1这一样的现象,就称之为幻读,幻读指的是一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行

产生幻读的原因是:行锁只能锁住行,但是新插入记录的这个动作,要更新的是记录之间的'间隙'。因此,Innodb 引擎 为了解决[  可重读]隔离级别下 [当前读]而造成的幻读问题,就引出了 next_key锁,就是记录锁和 间隙锁的组合。

1:RecordLock锁:锁定单个行记录的锁。

2:CapLock锁:间隙锁,锁定索引记录间隙,确保索引记录的间隙不变(范围锁,RR隔离级别支持)

3:Next-key Lock 锁: 记录时锁和间隙锁组合。锁住数据的同时,并且锁住 数据前后范围。(记录锁+范围锁,RR隔离级别支持)


http://www.ppmy.cn/news/905182.html

相关文章

Android Glide同步阻塞方式submit获得Bitmap,kotlin

droid Glide同步阻塞方式submit获得Bitmap,kotlin 需要放入后台线程,不能在主线程。 Android Glide预加载preload ,kotlin_zhangphil的博客-CSDN博客【代码】Android Paging 3,kotlin(1)在实际的开发中,虽然Glide解决了…

数据库结业项目作业(LOL数据库系统)

项目所用到的有Spring Boot , mysql,jdbc,myBatis,workbench,swagger-ui,druid 因为刚开始学习spring boot不久,对springmvc的机制还不太了解,借用swagger-ui的界面,本身只实现后端的…

lol相关的开源项目!好玩学习两不误!

大家好,我是【开源君】,分享好玩的项目,挖掘开源的价值。 今天给大家分享的开源项目的是**【lol】。** 项目介绍 英雄联盟这个游戏大家都不陌生吧,开源君今天发现一个好玩的开源项目,这是一个基于JavaWeb的英雄联盟的…

lolapp.php,微信小程序 LOL 英雄的开发介绍

这篇文章主要介绍了微信小程序 LOL 英雄介绍开发的相关资料,需要的朋友可以参考下 最近微信小程序炒得火热,就跟成都的这个房价一样.昨天我也尝试了一下,做了一个自己的英雄列表.今天将自己的制作过程记录于此. 1.下载微信开发者工具 官网链接:https://mp.weixin.qq.com/debug/…

LOL自制皮肤1-解析WAD文件的一些总结

0.暂时不多BB 所用到的工具介绍和来源以及注意事项 到这位大佬这里下载(本文章目前只针对Fantome.Libraries.League.dll使用的总结,其他功能可以自行挖掘~~) https://github.com/Crauzer/Obsidian/releases 注意!!!:最好开个VPN翻墙,出于安全和尊重作者问题,本人不会提供且…

简历-lol学习性项目

时间:2018年 以lol做目标的学习性探索的项目,只用于对tp反作弊原理的验证与学习。 包含一个简略的d3d自绘菜单,简略的hook库和相关3D坐标转2D计算及绘制的一些逻辑等(常见基础技术不过多列举)。 整个项目代码量约 1…

用户账户控制(无法截图/退出全屏/使用窗口模式)

用户账户控制提示框无法截图,这是我遇到的问题,如下: 就是这种对话框,一般是程序请求管理员权限运行,就会弹出,默认是全屏状态。 无法截图,试过什么PrintScreen等均不行。 这里提供一个办法&a…

c语言lol战绩查询系统,LOL:战绩阵容一键查询 云顶之弈战绩查询功能已上线!...

原标题:LOL:战绩阵容一键查询 云顶之弈战绩查询功能已上线! 国服的云顶之弈上线也有一段时间了,不知道小伙伴们体验的怎么样了?相信在大家体验云顶之弈的过程中都会有一个困扰,那就是我怎么才能像查排位赛战绩一样查云…