美文网首页
什么是Mysql幻读

什么是Mysql幻读

作者: 吃掉夏天的怪物 | 来源:发表于2021-09-23 14:40 被阅读0次

笔记

for update相当于加了一个行锁
会命中d = 5的这一行,对应的主键是id等于5,因此在select语句执行完后d=5的这一行会加一个写锁,那么由于我们这个两阶段锁的协议呢,这个写锁会执行commit语句的时候进行一个释放。
在mysql innoDB的默认级别是可重复读
幻读:一个事务在前后两次查询同一个范围,或者说查询同一条语句的时候,后一次查询看到了前一次看不到的东西。
比如说,我有两个事务A和B,A执行了好多次select * from t where d = 5 for update;,B在这个表里insert了d=5的东西,再次select的时候前一次执行和后一次执行看到的事务就不一样了(幻读)。
在可重复读级别下,普通的查询是我们的快照查询,不会看到其它事务插入的数据。因此幻读在当前读下才会出现。
幻读仅指新插入的行,而不是update的行。
什么叫做当前读,当前读就指上面说的for update。虽然给这行加锁,也它也要说看到这行最新的数据,for update这里也叫做我们的当前读。因为更新之前必须先查询一下当前的值。
select in share modle也是一个当前读的东西,指在更新之前必须先查询一下当前的值,所以叫做当前读。快照读只是在语句执行之前或者事务开始的时候,创建一个视图然后,后面的读呢都是基于这个视图来读的,像我们说的版本号似的,不会查询这个最新的值。
for update会查询最新的值,那出现幻读怎么办呢。for update肯定是想把d = 5这行给锁住。有了幻读之后,这个语句的语义就被破坏了,这个锁的目的是保证数据的前后一致性,这样也破坏了这个一致性。
幻读产生的原因是行锁只能锁住当前这一行,我还可以往里面再Insert东西,并不能去锁住其它的行。所以这里我们引出了另外的一个锁——间隙锁。
1 5 10 ,比如当前查询的这个值为5它会把前这个值的前一位和后一位都给锁住。

相关文章

  • 美团三面:一直追问我, MySQL 幻读被彻底解决了吗?

    什么是幻读? 首先来看看 MySQL 文档是怎么定义幻读(Phantom Read)的: The so-calle...

  • 什么是Mysql幻读

    笔记[https://www.bilibili.com/video/BV1964y1s7tD?spm_id_fro...

  • mysql的幻读处理机制

    当前与快照读 当前与快照读 mysql的幻读处理机制 参考Mysql(Innodb)如何避免幻读我在mysql 8...

  • 程序员之MySQL

    1.MySQL解决幻读问题 MySQL InnoDB通过版本号解决事务的幻读问题a.select情况:InnoD...

  • mysql知识点总结

    mysql事务 什么是事务 事务的四大特性 事务的隔离级别 脏读,不可重复读,幻读分别是什么 隔离级别脏读不可重复...

  • MySQL是怎么解决幻读问题的?

    问题分析 首先幻读是什么? 根据MySQL文档上面的定义 The so-called phantom proble...

  • MySQL 间隙锁

    间隙锁 间隙锁在MySQL中解决了幻读问题,在MySQL中通过RR也能解决幻读。 但是使用间隙锁时有两个坑需要注意...

  • Mysql —— 幻读

    前言 在学习隔离级别以及mysql的并发问题处理时,一直对幻读的概念比较模糊,在网上搜集了很多资料,也是各有各的说...

  • MySQL 幻读

    MySQL 在当前读的情况下,如果看到了其他事务新插入的一条数据,这种情况称为幻读。是指一个事务在前后两次查询同一...

  • MySQL幻读

    幻读(phantom read) 前提条件:InnoDB引擎,可重复读隔离级别,使用当前读时。 表现:一个事务(同...

网友评论

      本文标题:什么是Mysql幻读

      本文链接:https://www.haomeiwen.com/subject/cjobgltx.html