1. 什么是幻读?

建立一张表如下:

按照下面步骤执行两个事务。

事务1

事务2

由此,可以把幻读理解为:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读。

2. 解决幻读

2.1 RR(可重复读)级别下防止幻读

RR级别下只要对SELECT操作手动加**排他锁(X锁)**即可实现类似SERIALIZABLE级别(会对SELECT隐式加锁),代码如下:

# 这里需要用 X锁, 用 LOCK IN SHARE MODE 拿到 S锁 后我们没办法做 写操作
SELECT `id` FROM `users` WHERE `id` = 1 FOR UPDATE;

这里id=3的记录不存在,FOR UPDATE也对此记录加锁。InnoDB 的行锁(gap锁是范围行锁,一样的)锁定的是记录所对应的索引,且聚簇索引同记录是直接关系在一起的。

T1事务

T2事务

id = 3 的记录不存在,开始执行事务

step.1 :T1事务 查询id = 3的记录,并对其加X锁

step.2 :T2事务 插入id = 3的记录,但是会被阻塞

step.3 :T1事务 插入 id= 3的记录,成功执行,但此时T2事务依然被阻塞,直到T1提交事务后,T2才被唤醒,但主键冲突报错。

T1事务最终被成功执行,T2事务干扰T1事务失败。

2.2 SERIALIZABLE级别杜绝幻读

在此级别下,我们便不需要对 SELECT 操作显式加锁,InnoDB会自动加锁,事务安全,但性能很低。

先修改数据库隔离级别:MySQL8查询事务应该使用transaction_isolationtx_isolation在MySQL 5.7.20后被弃用。

设置数据库隔离级别为SERIALIZABLE,左边是事务T1,右边是事务T2.

step.1:T1查询id=4的记录是空, Innodb隐式对其加X锁。

step.2:T2向表中插入id=4的记录,被阻塞

step.3:T1向表中插入id=4的记录,成功执行(此时T1仍然被阻塞)

接着,提交T1事务,此时T2唤醒但是提示冲突错误。

MySQL幻读详解及解决方法相关推荐

  1. PHP开发中常见的安全问题详解和解决方法

    PHP开发中常见的安全问题详解和解决方法 参考文章: (1)PHP开发中常见的安全问题详解和解决方法 (2)https://www.cnblogs.com/walblog/articles/83313 ...

  2. MySQL解决幻读详解

    简单来说就是通过mvcc + next-key locks 防止幻读 幻读是什么? 当前事务读取了一个范围的记录,另一个事务在该范围内插入了新记录,当前事务再次读取该范围内的记录就会发现新插入的记录, ...

  3. mysql 脏读 不可重复读 幻读_mysql事务隔离级别/脏读/不可重复读/幻读详解

    一.四种事务隔离级别 1.1read uncommitted 读未提交 即:事务A可以读取到事务B已修改但未提交的数据. 除非是文章阅读量,每次+1这种无关痛痒的场景,一般业务系统没有人会使用该事务隔 ...

  4. 不可重复读和幻读详解(必看!!!)

    前言:看了很多关于MySQL隔离级别的视频和文章,发现了一个问题,大家都是说,不可重复读是在一个事务中读到了另一个事务提交后修改后的数据,而幻读是一个事务读到了另一个事务中添加并提交后的数据.那么删除 ...

  5. 使用selenium时遇到的报错selenium.common.exceptions.WebDriverException: Message: Service xxxxstaus:1详解及解决方法详解

    在开始之前,分享一下使用selenium常遇到的几个问题和报错: 1.首先就是版本问题的报错:selenium.common.exceptions.NoSuchWindowException: Mes ...

  6. MySQL锁与脏读、不可重复读、幻读详解

    一.MySQL锁 1.锁简介 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的 计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据 ...

  7. MySQL 注入详解及其解决方法

    MySQL 注入 今天刚刚看到MySQL注入 首先,先来了解一下,SQL注入到底是什么 解决办法 今天刚刚看到MySQL注入 首先,先来了解一下,SQL注入到底是什么 在网上可以收到很多关于SQL注入 ...

  8. MySQL无法读表错误的解决方法(MySQL 1018 error)

    查看MySQL的数据目录,一般无法读取表都是复制过来的数据库,即使root用户也无法读取表,需要修改目录权限 #root用户登录mysql mysql -uroot -ppassword#查看data ...

  9. python引用numpy出错_引用numpy出错详解及解决方法

    numpy出错 解决方案 Problem: how to import numpy in subdirectory? Import error of numpy within subfolder. 错 ...

最新文章

  1. 【linux】Valgrind工具集详解(十三):Helgrind(线程错误检测器)
  2. 一种c#深拷贝方式完胜java深拷贝(实现上的对比)
  3. Dom4J两种节点添加方法比较
  4. 极有收藏价值的一组难求纯4位数字.com域名 #8847#含义你懂的。 http://t.cn/ae9CTd
  5. 深入理解JavaScript this
  6. app inventor2 打地鼠_春节越南旅行攻略必备手机APP推荐!旅游必备实用简单越南语...
  7. VS2008建立webserver(转)
  8. java 遍历所有内部类_JAVA-内部类
  9. 亚马逊技能开发入门_Amazon QuickSight入门
  10. 02-CSS基础与进阶-day11_2018-09-17-21-35-14
  11. 支付宝手机网站支付 错误代码 insufficient-isv-permissions 错误原因: ISV权限不足
  12. 信道估计之LMMSE估计
  13. 运放参数的详细解释和分析
  14. Kafka序列化器,分区器,拦截器,消息累加器
  15. JAVA的getBytes()方法
  16. EasyNVR网页摄像机直播方案H5前端构建之:区分页面是自跳转还是分享依据
  17. 数塔问题(数字三角形)
  18. 三十四、进阶之获取详情页面信息并显示
  19. 微信域名防封技术,微信域名防封解决方案
  20. 桌面上的我的电脑、文件夹打开后只有在任务栏显示

热门文章

  1. 库龄分析-先进先出法
  2. win7信息服务器iis管理器,win7系统打开Internet信息服务(IIS)管理器的操作方法
  3. 【任务栏输入法图标不见了怎么办】
  4. w5500跨网段_基于STM32F1的局域网通信模块W5500驱动
  5. 华为鸿蒙最大合作伙伴,全球第三大手机系统「鸿蒙」上线,这19款能抢先用…...
  6. 鸿蒙系统2.0 评测,鸿蒙2.0终于上机实测 多大内存能跑?
  7. 扩散模型 Diffusion Models 入门到实践 | 论文、学习资源、课程整理
  8. buzz桌面服务器连接失败,buzz桌面具体使用步骤介绍
  9. 2022建筑电工(建筑特殊工种)考试题库及答案
  10. HIVE——常用sql命令总结