广告
返回顶部
首页 > 资讯 > 数据库 >Mysql中的innoDB如何解决幻读
  • 320
分享到

Mysql中的innoDB如何解决幻读

2024-04-02 19:04:59 320人浏览 薄情痞子
摘要

目录1.Mysql的事务隔离级别2. 什么是幻读3. InnoDB如何解决幻读的问题4. 总结1.mysql的事务隔离级别 这四种隔离级别,当存在多个事务并发冲突的时候,可能会出现

1.mysql的事务隔离级别

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

2. 什么是幻读

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

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

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

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

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

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

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

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

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

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

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

每个数据行非唯一的索引列,都会存在一把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里面通过间隙锁方式解决了幻读的问题但是加锁之后一定会影响到并发性能,因此对与性能较高的一些业务场景,我们可以把隔离级别设置不可重复,那么这个级别不存在间隙锁,也不存在性能的影响

您可能感兴趣的文档:

--结束END--

本文标题: Mysql中的innoDB如何解决幻读

本文链接: https://www.lsjlt.com/news/147664.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Mysql中的innoDB如何解决幻读
    目录1.Mysql的事务隔离级别2. 什么是幻读3. InnoDB如何解决幻读的问题4. 总结1.Mysql的事务隔离级别 这四种隔离级别,当存在多个事务并发冲突的时候,可能会出现...
    99+
    2022-11-13
  • Mysql中的innoDB怎么解决幻读
    本篇内容介绍了“Mysql中的innoDB怎么解决幻读”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.Mysql的事务隔离级别这四种隔离级...
    99+
    2023-06-30
  • InnoDB解决幻读的方法详解
    目录前言事务隔离级别什么是幻读InnoDB 解决幻读方式总结前言 大部分人在日常的业务开发中,其实很少去关注数据库的事务相关问题,基本上都是 CURD 一把梭。正好最近在看 mysql 的相关基础知识,其中对于幻读问题之...
    99+
    2023-04-06
    innodb幻读 InnoDB如何解决幻读 mysql 解决幻读
  • 如何解决mysql幻读
    mysql中出现幻读的两种解决方法多版本并发控制(MVCC)多数数据库都实现了多版本并发控制,并且都是靠保存数据快照来实现的。事务每次取数据的时候都会取创建版本小于当前事务版本的数据,以及过期版本大于当前版本的数据。其原理时将历史数据存一份...
    99+
    2022-10-09
  • 如何解决MySQL的幻读问题
    如何解决MySQL的幻读问题?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。  1、MVCC快照,将历史数据存一份快照,在其...
    99+
    2022-10-18
  • MySQL如何解决幻读问题
    目录前言一、什么是幻读?二、幻读有什么问题?(1)需要单独解决(2)间隙锁引发的并发度三、如何解决幻读?三、总结前言   我们知道MySQL在可重复读隔离级别下别的事物提交的内容,是看不到的。而可提交隔离级别下是可以...
    99+
    2022-05-22
    MySQL 幻读
  • MySQL中怎么解决幻读
    本篇文章为大家展示了MySQL中怎么解决幻读,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 一、什么是幻读在一次事务里面,多次查询之后,结果集的个数不一致...
    99+
    2022-10-18
  • MySQL解决幻读的方法
    这篇文章将为大家详细讲解有关MySQL解决幻读的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、什么是幻读在一次事务里面,多次查询之后,结果集的个数不一致的情况叫做...
    99+
    2022-10-18
  • 一文详解MySQL是如何解决幻读的
    目录前言什么是幻读?什么是普通读和当前读?普通读当前读普通读是如何避免幻读的?当前读是如何避免幻读的?总结前言 SQL标准中定义了4种隔离级别,分别是读未提交、读已提交、可重复读以及序列化。不同的隔离级别下,可以解决不同...
    99+
    2023-04-19
    mysql幻读 怎样解决mysql的幻读 mysql避免幻读
  • MySQL中怎么解决幻读问题
    本篇文章给大家分享的是有关MySQL中怎么解决幻读问题,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、什么是幻读?  假设我们有表t结构如下,里面的初始数据行为:(0,0,0...
    99+
    2023-06-20
  • 你知道MySQL是如何解决幻读的吗?
    前言 SQL标准中定义了4种隔离级别,分别是读未提交、读已提交、可重复读以及序列化。不同的隔离级别下,可以解决不同的并发问题,如下图所示。当然MySQL也基本遵循了这个标准,但是在实现上稍有不同。 本文重点探讨下MySQL是如何解决幻读问题...
    99+
    2023-09-12
    mysql 数据库
  • MySQL中锁解决幻读问题的方法
    这篇文章主要介绍MySQL中锁解决幻读问题的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!什么是锁锁是一种用于保证在并发场景下每个事务仍能以一致性的方式读取和修改数据的方式,当一...
    99+
    2022-10-18
  • 【MySQL】MVCC是如何解决快照读下的幻读问题的
    文章目录 LBCC当前读 MVCC隐藏列undo logRead View 总结 我们从上文中了解到InnoDB默认的事务隔离级别是repeatable read(后文中用简称RR),它为了解决该隔离级别下的幻读的并发问...
    99+
    2023-08-17
    mysql 数据库 java mvcc 快照读
  • MySQL是怎么解决幻读问题的?
    前言   我们知道MySQL在可重复读隔离级别下别的事物提交的内容,是看不到的。而可提交隔离级别下是可以看到别的事务提交的。而如果我们的业务场景是在事物内同样的两个查询我们需要看到的数据都是一致的,不能被别的事物影响,就使用可重复读隔离...
    99+
    2014-10-24
    MySQL是怎么解决幻读问题的?
  • mysql中RR与幻读的问题怎么解决
    这篇“mysql中RR与幻读的问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“m...
    99+
    2022-10-19
  • Mysql的可重复读解决了幻读问题吗
    针对快照读(普通 select 语句),是通过 MVCC 方式解决了幻读,因为可重复读隔离级别下,事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,即使中途有其他事务插入了一条数据,是查询不出来这条数据的,所以就很...
    99+
    2023-09-01
    mysql 数据库 java
  • 详解MySQL 幻读及如何消除
    这是一篇数据库隔离级别的科普文章,旨在了解数据库中著名的幻读现象,为了专注,对脏读、不可重复读不作讨论。 事务隔离级别 MySQL有四级事务隔离级别: 读未提交 READ-UNCOMMITTED: 存在脏读,不可...
    99+
    2022-05-29
    MySQL 幻读 MySQL 幻读消除
  • 详解MySQL幻读及如何消除
    目录事务隔离级别 什么是幻读 如何消除幻读 总结 这是一篇数据库隔离级别的科普文章,旨在了解数据库中著名的幻读现象,为了专注,对脏读、不可重复读不作讨论。 事务隔离级别 MySQL...
    99+
    2022-11-12
  • MySQL的可重复读级别能解决幻读问题吗
    本篇内容介绍了“MySQL的可重复读级别能解决幻读问题吗”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!引言...
    99+
    2022-10-18
  • 如何解读MySQL的InnoDB引擎日志工作原理
    这篇文章主要介绍了如何解读MySQL的InnoDB引擎日志工作原理,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。当你使用UPDATE, IN...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作