首页 > 数据库 >MySQL可重复读隔离级别并没有完全解决幻读

MySQL可重复读隔离级别并没有完全解决幻读

时间:2022-11-06 22:02:07浏览次数:36  
标签:事务 快照 隔离 幻读 插入 MySQL 级别

MVCC产生幻读的场景

两种读法解决幻读的方法

  • 快照读:使用快照Read View,插入的数据,他的事务号也是插入任务所属的那个事务,只需要照常检查这个事务是否是可见的即可

  • 当前读:select···for update这种查询是当前读,因为每次读取都是为了拿来在其基础上修改,为了防止修改丢失这种情况,需要确保每次拿到的都是最新的数据,而幻读正是出现在这里的

    • 想要解决幻读,一个方法就是加锁,不让其他事务进行插入,这是串行化隔离级别的方法

    • 想要在可重复读隔离级别下处理当前读的幻读问题,使用的是间隙锁

 

间隙锁是什么呢,执行了当前读任务之后,比如读取行的id是>2,就对这个范围的数据加上next-key lock(间隙锁和记录锁的组合),然后当其他事务执行插入的时候,会生成一个插入意向锁,同时进入等待状态,直到最开始的事务进行了commit,这样就避免了幻读

两种未被解决,发生幻读的场景

  • 第一种:MVCC的漏洞

    • A第一次执行了select生成了Read View,之后事务B进行了插入,这时候A如果想要再次查找,拿到的版本号是在快照之后生成的,是不可见的

    • 随后A对这个数据进行了update,版本号变为A的事务id了,突然又可以查到了

  • 第二种

    • 第二种比较简单,就是第一次读是快照读,第二次是当前读,第二次读并没有依赖第一次查到的快照,第一次也没有给第二次读创造锁

    • 所以不能读到

标签:事务,快照,隔离,幻读,插入,MySQL,级别
From: https://www.cnblogs.com/mumayiren/p/16864277.html

相关文章

  • Mysql 之MVCC
    mvcc介绍MVCC是数据库提供并发访问控制的一种技术。其核心理念是数据快照,不同的事务访问不同版本的数据快照,从而实现不同的事务隔离级别。虽然是说具有多个版本的数据快照......
  • Mysql 主从复制 之宝塔篇
    链接:https://blog.csdn.net/qq_30180559/article/details/836286161.在两台服务商分别按照好宝塔及其数据库2.分别在两台服务器上创建数据库2.1假设一号服务器:192.1......
  • MySQL_子查询_exists后面的子查询使用
    语法Exists(完整的查询语句)结果:1or0 exists查询:先执行外查询或子查询,某一个字段的值再根据结果过滤子查询涉及到了主查询的字段 案例#查询有员工的部门名......
  • MySQL_子查询_from后面的子查询 的使用
    将子查询结果充当一张表,要求必须起别名#查询每个部门的平均工资的工资等级#第一步:SELECTAVG(salary),department_idFROMemployeesGROUPBYdepartment_idSELECT......
  • MySQL_子查询
    含义出现在其他语句中的select语句,称为子查询或内查询外部查询语句,称为主查询或外查询 分类按子查询出现的位置Select后面   仅仅标量子查询From后......
  • Mysql InnoDB Redo log
    一丶什么是redoinnodb是以也为单位来管理存储空间的,增删改查的本质都是在访问页面,在innodb真正访问页面之前,需要将其加载到内存中的bufferpool中之后才可以访问,但是在聊......
  • 宝塔面板上docker配置mysql主从复制(手把手教程)
    链接:https://www.pudn.com/news/632ae4752aaf6043c9a3c611.html查看镜像是否拉取成功dockerimages借助镜像创建两个mysql容器(注:要放行端口,我这里是3339和3340)doc......
  • 一次mysql源码安装
    一次mysql源码安装需要准备的条件cmakegccboost1.59.0这里贴出我对应的依赖版本mysql版本对应的依赖boost版本必须要匹配,编译过程如果有报错信息boost要......
  • Spark:流式读取Kafka后读取ES并存储值Mysql,业务以及源码(一)
    业务:最近公司需要处理一些关于数据的问题,需要spark+kafka+es+mysql进行联合处理主要的业务也比较简单,大致是如下图 主要步骤如下:一级项目将相关的处理标......
  • Mysql-DDL操作表
    查询表showtables;查看表结构decs表名;创建表注意创建表列名要加反引号createtable表名(列名1数据类型,列名1数据类型,..............);......