MYSQL幻读问题

news2025/1/12 15:59:58

幻读是什么?

“Phantom Problem是指在同一事务下,连续执行两次同样的SQL语句可能导致不同的结果,第二次的SQL语句可能会返回之前不存在的行。”摘录来自 MySQL技术内幕:InnoDB存储引擎(第2版) (数据库技术丛书)

​ 通俗来说就是,time1:事务A读取某个范围,time2:事务B在这个范围中插入了一条新记录并提交事务,time3:事务A再次读取该范围的记录时读取到事务B新增的记录。

如下:

目前InnoDB存储引擎中,数据库有表如下:

-- ----------------------------
-- Table structure for film
-- ----------------------------
DROP TABLE IF EXISTS `film`;
CREATE TABLE `film` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb3;

-- ----------------------------
-- Records of film
-- ----------------------------
BEGIN;
INSERT INTO `film` (`id`, `name`) VALUES (1, 'film1');
INSERT INTO `film` (`id`, `name`) VALUES (2, 'film2');
COMMIT;

Time1: 开启事务A , 查询表film中的所有记录。

在这里插入图片描述

Time2:在film表中插入一条ID 为 3的记录

在这里插入图片描述

Time3: 事务A查询表film中所有的数据;注意这时select出的记录中是没有ID为3的记录。

在这里插入图片描述

但是我们会发现update ID 为3的记录是成功的,也就是说事务A是可以感知到事务B新增的ID为3的记录。

在这里插入图片描述

这时再去读区数据发现是可以读取到的

在这里插入图片描述

这就是幻读问题。

如何避免幻读问题?

在RR级别下,采用Next-Key Locking的算法避免幻读问题,即使用FOR UPDATE。

SELECT * FROM film FOR UPDATE;

对于上面的SQL语句,会将(-∞,+∞)这个范围加锁,因此在这个范围内的插入都是不允许的,从而避免幻读。当然如果是id > 2 范围查找那么锁住的也就是(2,+∞)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/870303.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WebStorm

WebStorm 介绍下载安装Activation 介绍 WebStorm是由JetBrains公司开发的一款集成开发环境(IDE),主要专注于前端开发和Web开发。它旨在提供一套强大的工具和功能,以支持开发者在前端项目中编写、调试和维护代码。 JetBrains官网: …

泛微E-Office任意文件上传漏洞复现(HW0day)

0x01 产品简介 泛微E-Office是一款标准化的协同 OA 办公软件,泛微协同办公产品系列成员之一,实行通用化产品设计,充分贴合企业管理需求,本着简洁易用、高效智能的原则,为企业快速打造移动化、无纸化、数字化的办公平台。 0x02 漏…

Python(八十三)字符串的比较操作

❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

【Linux初阶】进程间通信介绍 管道

🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【Linux初阶】 ✒️✒️本篇内容:进程间通信介绍,管道概述,匿名管道应用,命名管道应用 🚢&#…

7-1 输出倒三角

题目描述: 本题要求编写程序,输出指定的由“*”组成的倒三角图案。 输入格式: 本题目没有输入。 输出格式: 按照下列格式输出由“*”组成的倒三角图案。 * * * ** * ** **代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB 源代码&#xf…

Postman

Postman 简介下载安装 简介 Postman 是一款用于测试和开发 API(应用程序编程接口)的工具,它提供了用户友好的界面和丰富的功能,帮助开发者轻松地创建、测试、调试和文档化各种类型的 API。无论是在构建 Web 应用、移动应用还是其…

fork函数和exec族函数的结合使用 的案例

首先回顾之前所讲,在说明“为什么要创建进程”的时候,提到过以下两个原因: 其中第一个原因很好理解,而第二个原因就包含了上节所讲的exec族函数的知识点,并且不管是之前的博文还是上节的exec,都提到了一点“…

数据结构笔记--二叉树经典高频题

1--二叉树的最近公共祖先 主要思路: 最近祖先只有两种情况:① 自底向上,当两个目的结点分别在当前结点的左右子树时,当前结点为两个目的结点的最近祖先;② 最近祖先与其中一个目的结点相同,则另一个目的结点…

【C++】内存管理与模板

目录 一、内存管理 1.new与delete基本用法 (1) 内置类型 (2) 自定义类型 2.new, delete与malloc, free对比 (1) 内置类型 (2) 自定义类型 (3)综合特点 3.new与delete的底层实现 4. 定位new表达式 二、模板 1.引入机制 2. 基本使用 (1) 函数模板 ①概念&#xff1a…

【C语言】每日一题---1

大家好&#xff0c;我是苏貝&#xff0c;本篇博客是系列博客每日一题的第一篇&#xff0c;本系列的题都不会太难&#xff0c;如果大家对这种系列的博客感兴趣的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 下面代码的结果是&#xff1a; #include <…

203、仿真-基于51单片机6自由度机械手金属液体控制报警Proteus仿真设计(程序+Proteus仿真+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、程序源码 资料包括&#xff1a; 需要完整的资料可以点击下面的名片加下我&#xff0c;找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选择 方案一&a…

2023国赛数学建模A题B题C题D题E题思路分析 2023全国大学生数学建模思路

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 全国大学生数学建模…

前端开发:数组对象判断重复的方法详解

前言 在前端开发过程中,关于数据处理是非常常用的操作,尤其是通过算法处理从后端获取的数据甚为重要。而且在前端开发中,两大类型的数据处理是必备的:数组和对象。与其说是数据处理,不如说是数组和对象的处理。实际开发中,关于数组数据的处理所占比例更高,尤其是涉及到表…

uniapp项目如何运行在微信小程序模拟器上

在HbuilderX中的小程序写完后自己一定要保存&#xff0c;否则会出不来效果 那么怎么让uniapp项目运行在微信小程序开发工具中呢 1 在hbuilderx中点击运行到小程序模拟器 2 然后在项目目录中会生成一个文件夹 在微信小程序开发软件中的工具>安全设置>打开端口 或者在微…

使用sqlplus连接oracle,提示ORA-01034和ORA-27101

具体内容如下 PL/SQL Developer 处 登录时 终端处 登录时 ERROR: ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exist Process ID: 0 Session ID: 0 Serial number: 0 解决方法是执行以下命令 sqlplus /nolog conn / as sysdba startup …

ECS服务器安装docker

​ 为了安装并配置 Docker &#xff0c;你的系统必须满足下列最低要求&#xff1a; 64 位 Linux 或 Windows 系统 如果使用 Linux &#xff0c;内核版本必须不低于 3.10 能够使用 sudo 权限的用户 在你系统 BIOS 上启用了 VT&#xff08;虚拟化技术&#xff09;支持 on your s…

软件测试基础篇——Linux

1、Linux系统的特征 开源免费&#xff1a; 开源&#xff1a;开放源代码&#xff0c;指的是底层的源代码是可以开放出来&#xff0c;给相关的开发者&#xff0c;根据实际的需求做出修改的。 免费&#xff1a;不花钱&#xff0c;自由传播。 ​ Linux是一种免费使用和自由传播的…

【Tomcat】(Tomcat 下载Tomcat 启动Tomcat 简单部署 基于Tomcat进行网站后端开发)

文章目录 Tomcat下载Tomcat启动Tomcat简单部署 基于Tomcat进行网站后端开发 Tomcat Tomcat 是一个 HTTP 服务器.HTTP 协议就是 HTTP 客户端和 HTTP 服务器之间的交互数据的格式. HTTP 服务器我们可以通过 Java Socket 来实现. 而 Tomcat 就是基于 Java 实现的一个开源免费,也是…

【云原生】微内核的分布式操作系统 Kubernetes

微内核的分布式操作系统 Kubernetes 如今&#xff0c;Kubernetes 已经成为分布式集群管理系统和公有云 / 私有云的事实标准。实际上&#xff0c;Kubernetes 是一个分布式操作系统&#xff0c;它是 Google 在分布式操作系统领域十余年工程经验和智慧的结晶&#xff0c;而 Google…

实时语义分割网络 BiSeNet 训练自定义数据集

语义分割是一种将标签分配给每个像素的技术&#xff0c;广泛应用于场景理解、自动驾驶、人机交互、视频监控等领域。随着卷积神经网络的不断发展&#xff0c;研究人员提出了基于全卷积网络的语义分割算法&#xff0c;这些算法在语义分割任务中表现出良好的性能。 论文地址&…