02.05 Day 17 - 重温 Day 8

news/2024/7/7 9:45:41

大家好,我是 Snow Hide,作为《MySQL 实战》这个专栏的学员之一,这是我打卡的第 17 天,也是我第 69 次进行这种操作。

今天我温习了该专栏里一篇叫《幻读是什么,幻读有什么问题?》的文章。

关键词总结:幻读是什么?、幻读有什么问题?(语义问题、一致性问题)、如何解决幻读?(间隙锁、next-key lock、Supremum、间隙锁生效场景)。

 

所学总结:

 

幻读是什么?

一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次查询没有看到的行。幻读在 “当前读” 下才会出现。幻读仅指 “新插入的行”。
 

幻读有什么问题?

语义问题

事务一的语句根据某个字段的值的条件查询到了数据,事务二根据另一个值的条件更改将事务一查询时所依赖的字段的值更改成与事务一查询时所匹配的值,导致事务三在执行事务一相通的查询语句时多查出一条数据,这个操作破坏了事务一里查询语句的加锁声明。随后,事务四插入了一条数据,在事务一查询所依赖的字段上插入了与事务一查询条件匹配的值,导致事务四在执行与事务一相同查询语句时查询出新插入的数据,一共查询出三条语句,这也破坏了事务一查询语句的加锁声明。

一致性问题

锁的设计是为了保证数据的一致性。而这个一致性,不止是数据库内部数据状态在此刻的一致性,还包含了数据和日志在逻辑上的一致性。即使把所有的记录都加上锁,还是阻止不了新插入的记录,这也就是为什么 “幻读” 会被单独拿出来解决的原因。
 

如何解决幻读?

间隙锁

为了解决幻读问题,InnoDB 引入了间隙锁(Gap Lock)。
将两个值之间的空隙锁住。数据行是可以加上锁的实体,数据行之间的间隙也可以加上锁的实体。
跟间隙锁存在冲突关系的,是 “往这个间隙中插入一个记录” 这个操作。
间隙锁 = 开区间

next-key lock

开后闭区间。

Supremum

+∞是开区间。InnoDB 给每个索引加了一个不存在的最大值 spuremum,也就是 “前开后闭区间”。

间隙锁生效场景

在可重读隔离级别下才会生效。

 

末了

重新总结了一下文中提到的内容:全表扫描的加锁方式、解决幻读问题、引入间隙锁、由于间隙锁导致的死锁现象、间隙锁会影响系统的并发度。


http://www.niftyadmin.cn/n/1896817.html

相关文章

微信小程序 MinUI 组件库系列之 loadmore 页底组件

MinUI 是基于微信小程序自定义组件特性开发而成的一套简洁、易用、高效的组件库,适用场景广,覆盖小程序原生框架、各种小程序组件主流框架等,并且提供了高效的命令行工具。MinUI 组件库包含了很多基础的组件,其中 loadmore 页底组…

Vmware创建Linux虚拟机

很多情况下我们想要一个Linux环境,却很难有条件单独使用一台机器来部署Linux系统,因此经常会选择使用虚拟机的形式或者是选择安装双系统。这里我主要记录一个我在虚拟机中安装Linux系统的过程。 我这里你使用的虚拟机软件是VMware。下面多图预警~~~~~~ …

mysql 5.7.17 win10_mysql 5.7.17 安装配置方法图文教程(windows10)

mysql 5.7.17 安装配置方法整理第一步到MySQL官网下载mysql-5.7.17-winx64.zip第二步 解压缩 mysql-5.7.17-winx64.zip第三步 新建一个my.ini文件,然后用记事本打开输入mysql的基本配置:[mysql]; 设置mysql客户端默认字符集default-character-setutf8[my…

生成纯ASCII的图像

我们经常见到在一些项目的启动的过程中有一些特殊的字符来标识这个项目,比如Redis,又或者SpringBoot,那么这些字符是怎么做到的呢,如果你认为是一个一个敲的,那就out了,有一个网站可以非常轻松的来处理这件…

vue-piczoom:基于vue2.x的电商图片放大镜插件

最近在撸一个电商网站,有一个需求是要像淘宝商品详情页那样,鼠标放在主图上,显示图片放大镜效果,找了一下貌似没有什么合适的vue插件,于是自己撸了一个,分享一下。小白第一次分享,各位大神莫见笑…

mysql total语法_Mysql基础语法

Mysql数据库三种基本操作:DDL--数据定义语言(create,alter,drop,declare)DML--数据操纵语言(select,delete,update,insert)DCL--数据控制语言(grant,revoke,commit,rollback)Mysql基础语句1、创建数据库create database database_…

Maven项目指定编译版本和文件编码

新创建的Maven项目JDK的版本是1.5的,几年前可能还可以,现在都到了JDK12的年代,再使用JDK1.5就说不过去了。所以在新创建了Maven项目之后,我们首先需要对JDK的版本进行指定。 Maven提供了一个插件来解决这个问题,可以直…

mysql里面的打钩框是什么东西_jquery 如何对checkbox打勾,取消打勾,打勾判断呢?...

摘要:下文讲述使用jquery框架操作checkbox的方法分享,如下所示;实现思路:1.对多选框进行打勾操作$("#checkboxId").attr("checked",true);2.取消多选框打勾操作$("#checkboxId").attr("checked",fal…