美文网首页
幻读复现

幻读复现

作者: 不存在的bug | 来源:发表于2021-03-30 00:59 被阅读0次

DDL(mysql8.0,5.7差不多)

create table testbigdata.test_dead_lock
(
    id    int auto_increment
        primary key,
    classid int     null,
    deleted tinyint null,
    constraint idx_classid
        unique (classid)
);


T1

start transaction with consistent snapshot ;  //立即开启事务
select sleep(5);
select * from test_dead_lock where classid > 234 ;  //因为是快照读,所以不会出现幻读
select sleep(10);
select * from test_dead_lock where classid > 234 for update ; //因为for update/(lock in share mode)所以该select变成了当前读,所以会出现幻读,(如果这句不加for update 或 for share,那么这句在当前事务内使用同一个视图,所以不会出现幻读)
commit ;

T2

begin;
insert into test_dead_lock (classid, deleted) VALUES (600,0);
commit;

所以,RR级别下只解决了普通select下的幻读(快照读),如果是当前读(加了 for update / lock in share mode)则还是会出现幻读。

为什么第一个句不加 for update等,因为update操作都会加排他锁,此时无论此处的select 加S锁还是X锁,都是互斥了的,只会等待该事务commit了,释放锁了,T2才会执行。

相关文章

  • 幻读复现

    DDL(mysql8.0,5.7差不多) T1 T2 所以,RR级别下只解决了普通select下的幻读(快照读),...

  • MySQL - 幻读 、间隙锁

    select for update 加写锁。事物提交才释放 什么是幻读? 产生幻读的场景: 幻读指的是一个事务在前...

  • 系统原理-MVCC

    在SQL标准中,RR是无法避免幻读问题的,但是InnoDB实现的RR避免了幻读问题。RR解决脏读、不可重复读、幻读...

  • 丁奇-MySQL实战读书笔记20

    幻读是什么,幻读有什么问题? 什么是幻读?幻读指的是一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次...

  • 数据库事务隔离级别

    脏读 不可重复读 幻读

  • Mysql中事物隔离问题

    脏读:当前事物可以查看别的事物未提交的数据幻读:幻读与不可重复读很容易让人搞混,幻读的侧重点在于新增和删除。表示在...

  • 幻读

    什么是幻读? 在同一事务中,连续执行两次同样的SQL语句可能导致不同的结果,第二次的SQL语句可能会返回之前不存在...

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

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

  • mysql 幻读的详解

    幻读 首先我们要搞明白何谓幻读,目前网上的众多解释幻读的博文个人感觉仔细设想一下就能找出推翻的例子,就像博文把 非...

  • mysql-幻读,间隙锁

    1.什么是幻读幻读,并不是说两次读取获取的结果集不同,幻读侧重的方面是某一次的 select 操作得到的结果所表征...

网友评论

      本文标题:幻读复现

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