Mysql-innoDB如何解决幻读?

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Mysql-innoDB如何解决幻读?

1.Mysql的事务隔离级别


image.png

这四种隔离级别,当存在多个事务并发冲突的时候,可能会出现脏读,不可重复读,幻读的一些问题,而innoDB在可重复读隔离级别模式下解决了幻读的一个问题,



2. 什么是幻读


幻读是指在同一个事务中,前后两次查询相同范围的时候得到的结果不一致

image.png

如图,第一个事务里面,我们执行一个范围查询,这个时候满足条件的数据只有一条,而在第二个事务里面,它插入一行数据并且进行了提交,接着第一个事务再去查询的时候,得到的结果比第一次查询的结果多出来一条数据,注意第一个事务的第一次和第二次查询,都在同一个事物里面,所以,幻读会带来数据一致性的问题



3. InnoDB如何解决幻读的问题


InnoDB引入间隙锁next-key lock机制去解决幻读问题


image.png

假如现在存在这样一个B+Tree的索引结构,这个结构有4个索引元素,分别是1,4,7,10 当我们通过主键索引查询一条记录,并且对这条记录通过for update加锁的时候

image.png

这个时候会产生一个记录锁,也就是行锁,锁定id=1这个索引

image.png

被锁定的记录在锁释放之前,其他事务无法对这一条记录做任何操作的,前面我们所过对幻读的定义,幻读是指在同一个事务中,前后两次查询相同范围的时候得到的结果不一致,注意这里敲掉的是范围查询,也就是说要解决幻读的问题,必须保证一个点


image.png

就是如果一个事务通过这样一条语句进行锁定的时候,另外一个事务再执行

image.png

这样一条insert语句需要被阻塞,直到前面获得所的事务被释放,所以在innonDB设计一种间隙锁,它的主要功能是锁定一定范围内的索引记录

image.png

当对查询范围id > 4 and id < 7这个范围加锁的时候,会针对B+数中(4,7)这个开区间的范围加间隙锁,意味着在这种情况下其他事务对这个区间的数据进行插入更新删除都会被锁住,但是还有另外一种情况,比如像这样

image.png

这条查询语句针对id > 4这个条件加锁,那么它需要锁定多个索引区间,所以这个情况下InnoDB引入一个叫next-key lock机制,next-key lock相当于间隙锁和记录锁的合集,记录锁锁定存在记录的行,间隙锁锁住的是记录行之间的间隙,而next-key lock锁住的是两者的和

image.png

每个数据行非唯一的索引列,都会存在一把next-key lock,当某个事务持有这一行数据的next-key lock的时候,会锁住一段在左开右闭区间的数据,因此当通过id > 4这样一个范围加锁的时候,InnoDB会去加一个next-key lock锁,锁定的区间范围是(4,7 ](7,10 ](10,+♾️ ]。间隙锁next-key lock的区别是在加锁的范围,间隙锁锁定的是两个索引之间的间隙,而next-key lock会锁定多个索引区间,它包含记录锁间隙锁当我们使用范围查询不仅仅命中Record记录,还包含了Gap间隙的时候,在这种情况下使用的就是临键锁,也就是next-key lock它是Mysql里面默认的行锁算法



4. 总结


虽然InnoDB里面通过间隙锁方式解决了幻读的问题但是加锁之后一定会影响到并发性能,因此对与性能较高的一些业务场景,我们可以把隔离级别设置不可重复,那么这个级别不存在间隙锁,也不存在性能的影响



相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
关系型数据库 MySQL 数据库
MySQL谈谈InnoDB怎么解决幻读的
MySQL谈谈InnoDB怎么解决幻读的
27 2
|
9月前
|
算法 关系型数据库 MySQL
【Mysql-InnoDB 系列】幻读、死锁与事务调度
本篇继续分析Mysql InnoDB引擎中的幻读、死锁和事务调度的相关问题
64 0
|
SQL 存储 关系型数据库
MySQL InnoDB 加锁机制
MySQL InnoDB 加锁机制
223 0
|
SQL 存储 Oracle
mysql事务 MVCC
mysql事务 MVCC
136 0
|
SQL 存储 算法
彻底掌握 MySQL InnoDB 的锁机制
彻底掌握 MySQL InnoDB 的锁机制
|
SQL 关系型数据库 MySQL
你知道MySQL是如何解决幻读的吗?
你知道MySQL是如何解决幻读的吗?
296 0
你知道MySQL是如何解决幻读的吗?
|
存储 SQL 关系型数据库
MySQL中事务及MVCC原理
MVCC(Multi-Version Concurrency Control ,多版本并发控制)指的就是在使用READ COMMITTD、REPEATABLE READ这两种隔离级别的事务在执行普通的SEELCT操作时访问记录的版本链的过程,这样就可以使不同事务的读-写、写-读操作并发执行,从而提升系统性能。READ COMMITTD、REPEATABLE READ这两个隔离级别的一个很大不同就是生成ReadView的时机不同,READ COMMITTD在每一次进行普通SELECT操作前都会生成一个ReadView,而REPEATABLE READ只在第一次进行普通SELECT操作前生成一个R
108 0
MySQL中事务及MVCC原理
|
存储 SQL 算法
MySQL InnoDB MVCC机制
MySQL InnoDB MVCC机制
187 0
|
存储 关系型数据库 MySQL
Mysql事务以及InnoDB和MyISAM区别讲解
Mysql事务以及InnoDB和MyISAM区别讲解
181 0
Mysql事务以及InnoDB和MyISAM区别讲解
|
算法 关系型数据库 MySQL
深入理解MySQL的MVCC原理
深入理解MySQL的MVCC原理 一、MVCC定义 1、并发事务可能产生的问题 2、当前读和快照读 二、MVCC实现、原理 1、隐藏字段 2、版本链 3、ReadView 三、手动验证MVCC的原理 1、事务隔离级别为RC(读已提交隔): 2、事务隔离级别为RR(可重复读):
深入理解MySQL的MVCC原理