广告
返回顶部
首页 > 资讯 > 数据库 >MySQL解决幻读的方法
  • 620
分享到

MySQL解决幻读的方法

2024-04-02 19:04:59 620人浏览 泡泡鱼
摘要

这篇文章将为大家详细讲解有关Mysql解决幻读的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、什么是幻读在一次事务里面,多次查询之后,结果集的个数不一致的情况叫做

这篇文章将为大家详细讲解有关Mysql解决幻读的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

一、什么是幻读

在一次事务里面,多次查询之后,结果集的个数不一致的情况叫做幻读。

而多出来或者少的哪一行被叫做 幻行

二、为什么要解决幻读

高并发数据库系统中,需要保证事务与事务之间的隔离性,还有事务本身的一致性。

三、MySQL 是如何解决幻读的

如果你看到了这篇文章,那么我会默认你了解了 脏读 、不可重复读与可重复读。

1. 多版本并发控制(MVCC)(快照读)

多数数据库都实现了多版本并发控制,并且都是靠保存数据快照来实现的。

以 InnoDB 为例,每一行中都冗余了两个字断。一个是行的创建版本,一个是行的删除(过期)版本。版本号随着每次事务的开启自增。事务每次取数据的时候都会取创建版本小于当前事务版本的数据,以及过期版本大于当前版本的数据。

普通的 select 就是快照读。

select * from T where number = 1;

原理:将历史数据存一份快照,所以其他事务增加与删除数据,对于当前事务来说是不可见的。

2. next-key 锁 (当前读)

next-key 包含两部分

  1. 记录锁(行锁)

  2. 间隙锁

记录锁是加在索引上的锁,间隙锁是加在索引之间的。(思考:如果列上没有索引会发生什么?)

select * from T where number = 1 for update;
select * from T where number = 1 lock in share mode;
insert
update
delete

原理:将当前数据行与上一条数据和下一条数据之间的间隙锁定,保证此范围内读取的数据是一致的。

其他:mysql InnoDB 引擎 RR 隔离级别是否解决了幻读
引用一个 GitHub 上面的评论 地址:

Mysql官方给出的幻读解释是:只要在一个事务中,第二次select多出了row就算幻读。
a事务先select,b事务insert确实会加一个gap锁,但是如果b事务commit,这个gap锁就会释放(释放后a事务可以随意dml操作),a事务再select出来的结果在mvcC下还和第一次select一样,接着a事务不加条件地update,这个update会作用在所有行上(包括b事务新加的),a事务再次select就会出现b事务中的新行,并且这个新行已经被update修改了,实测在RR级别下确实如此。

如果这样理解的话,Mysql的RR级别确实防不住幻读

有道友回复 地址:

在快照读读情况下,mysql通过mvcc来避免幻读。
在当前读读情况下,mysql通过next-key来避免幻读。
select * from t where a=1;属于快照读
select * from t where a=1 lock in share mode;属于当前读

不能把快照读和当前读得到的结果不一样这种情况认为是幻读,这是两种不同的使用。所以我认为mysql的rr级别是解决了幻读的。

先说结论,MySQL 存储引擎 InnoDB 隔离级别 RR 解决了幻读问题。

如引用一问题所说,T1 select 之后 update,会将 T2 中 insert 的数据一起更新,那么认为多出来一行,所以防不住幻读。看着说法无懈可击,但是其实是错误的,InnoDB 中设置了 快照读 和 当前读 两种模式,如果只有快照读,那么自然没有幻读问题,但是如果将语句提升到当前读,那么 T1 在 select 的时候需要用如下语法: select * from t for update (lock in share mode) 进入当前读,那么自然没有 T2 可以插入数据这一回事儿了。

注意
next-key 固然很好的解决了幻读问题,但是还是遵循一般的定律,隔离级别越高,并发越低。

关于“MySQL解决幻读的方法”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

您可能感兴趣的文档:

--结束END--

本文标题: MySQL解决幻读的方法

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

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

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

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

下载Word文档
猜你喜欢
  • MySQL解决幻读的方法
    这篇文章将为大家详细讲解有关MySQL解决幻读的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、什么是幻读在一次事务里面,多次查询之后,结果集的个数不一致的情况叫做...
    99+
    2022-10-18
  • MySQL中锁解决幻读问题的方法
    这篇文章主要介绍MySQL中锁解决幻读问题的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!什么是锁锁是一种用于保证在并发场景下每个事务仍能以一致性的方式读取和修改数据的方式,当一...
    99+
    2022-10-18
  • InnoDB解决幻读的方法详解
    目录前言事务隔离级别什么是幻读InnoDB 解决幻读方式总结前言 大部分人在日常的业务开发中,其实很少去关注数据库的事务相关问题,基本上都是 CURD 一把梭。正好最近在看 mysql 的相关基础知识,其中对于幻读问题之...
    99+
    2023-04-06
    innodb幻读 InnoDB如何解决幻读 mysql 解决幻读
  • mysql幻读怎么解决
    本篇内容介绍了“mysql幻读怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!事务隔离级别(tx_isolation)mysql 有四...
    99+
    2023-07-02
  • 如何解决mysql幻读
    mysql中出现幻读的两种解决方法多版本并发控制(MVCC)多数数据库都实现了多版本并发控制,并且都是靠保存数据快照来实现的。事务每次取数据的时候都会取创建版本小于当前事务版本的数据,以及过期版本大于当前版本的数据。其原理时将历史数据存一份...
    99+
    2022-10-09
  • MySQL中怎么解决幻读
    本篇文章为大家展示了MySQL中怎么解决幻读,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 一、什么是幻读在一次事务里面,多次查询之后,结果集的个数不一致...
    99+
    2022-10-18
  • mysql幻读详解实例以及解决办法
    目录事务隔离级别(tx_isolation)幻读RR级别下防止幻读SERIALIZABLE级别杜绝幻读总结脏读/不可重复读的概念都比较容易理解和掌握,这里不在讨论 事务隔离级别(tx_isolation) mysql 有...
    99+
    2022-06-16
    mysql脏读幻读 MySQL幻读 mysql中的幻读
  • Mysql中的innoDB如何解决幻读
    目录1.Mysql的事务隔离级别2. 什么是幻读3. InnoDB如何解决幻读的问题4. 总结1.Mysql的事务隔离级别 这四种隔离级别,当存在多个事务并发冲突的时候,可能会出现...
    99+
    2022-11-13
  • 如何解决MySQL的幻读问题
    如何解决MySQL的幻读问题?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。  1、MVCC快照,将历史数据存一份快照,在其...
    99+
    2022-10-18
  • Mysql中的innoDB怎么解决幻读
    本篇内容介绍了“Mysql中的innoDB怎么解决幻读”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.Mysql的事务隔离级别这四种隔离级...
    99+
    2023-06-30
  • MySQL如何解决幻读问题
    目录前言一、什么是幻读?二、幻读有什么问题?(1)需要单独解决(2)间隙锁引发的并发度三、如何解决幻读?三、总结前言   我们知道MySQL在可重复读隔离级别下别的事物提交的内容,是看不到的。而可提交隔离级别下是可以...
    99+
    2022-05-22
    MySQL 幻读
  • mysql怎么解决幻读问题
    MySQL可以通过以下几种方式解决幻读问题:1. 事务隔离级别:将事务的隔离级别设置为串行化(SERIALIZABLE)可以解决幻读...
    99+
    2023-08-23
    mysql
  • MySQL是怎么解决幻读问题的?
    前言   我们知道MySQL在可重复读隔离级别下别的事物提交的内容,是看不到的。而可提交隔离级别下是可以看到别的事务提交的。而如果我们的业务场景是在事物内同样的两个查询我们需要看到的数据都是一致的,不能被别的事物影响,就使用可重复读隔离...
    99+
    2014-10-24
    MySQL是怎么解决幻读问题的?
  • [MySQL] 有没有解决幻读问题
    默认隔离级别下 , mysql没有解决幻读问题 , 需要应用代码里加一个锁来解决 幻读问题是啥   默认的隔离级别是可重复读 REPEATABLE-READ   ,  在这个模式下出现幻读的例子一般是这两种情况: 事务1和事务2同...
    99+
    2014-06-05
    [MySQL] 有没有解决幻读问题
  • MySQL中怎么解决幻读问题
    本篇文章给大家分享的是有关MySQL中怎么解决幻读问题,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、什么是幻读?  假设我们有表t结构如下,里面的初始数据行为:(0,0,0...
    99+
    2023-06-20
  • Mysql的可重复读解决了幻读问题吗
    针对快照读(普通 select 语句),是通过 MVCC 方式解决了幻读,因为可重复读隔离级别下,事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,即使中途有其他事务插入了一条数据,是查询不出来这条数据的,所以就很...
    99+
    2023-09-01
    mysql 数据库 java
  • 一文详解MySQL是如何解决幻读的
    目录前言什么是幻读?什么是普通读和当前读?普通读当前读普通读是如何避免幻读的?当前读是如何避免幻读的?总结前言 SQL标准中定义了4种隔离级别,分别是读未提交、读已提交、可重复读以及序列化。不同的隔离级别下,可以解决不同...
    99+
    2023-04-19
    mysql幻读 怎样解决mysql的幻读 mysql避免幻读
  • mysql幻读是什么及怎么解决
    MySQL幻读是指在一个事务中,读取到了其他事务插入的新数据,导致前后两次查询结果不一致的现象。解决幻读的方法有以下几种:1. 采用...
    99+
    2023-10-23
    mysql
  • MySQL(九):MVCC能否解决幻读问题
    尺有所短,寸有所长;不忘初心,方得始终。 请关注公众号:星河之码 幻读【前后多次读取,数据总量不一致】 同一个事务里面连续执行两次同样的sql语句,可能导致不同结果的问题,第二次sql语句可能会返回之前不存在的行。 事务A执行...
    99+
    2023-08-17
    mysql java 数据库
  • MySQL中的幻读
    一、什么是幻读 1.我们先来回顾一下MySQL中事务隔离级别 READ UNCOMMITTED :未提交读。READ COMMITTED :已提交读。REPEATABLE READ :可重复读。SER...
    99+
    2023-09-22
    mysql 数据库 java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作