MySQL Innodb中 可重复读隔离级别是否能完全规避幻读

news2025/4/17 3:44:23

一、MySQL 可重复读隔离级别下的幻读

MySQL Innodb引擎可重复读隔离级别下,已经尽可能最大程度的规避幻读的问题了,使得大多数情况下,重复读都是可以得到一致的结果。

针对于读数据,可以大致分为两种模式,快照读(select ... )保证每次数据读取相同,即使其他事务写入或更新了数据。另一种是当前读(select ... for update) 的方式,每次读取最新的数据。不过两种方式解决幻读的策略不同。

  • 快照读模式下,通过 MySQL MVCC 多版本机制解决,在执行第一个 select 语句后,会创建一个 Read View,后续的查询语句会先查询这个 Read View,通过 Read View 就可以在 undo log 版本链中找到事务开始的数据,所以整个过程中可以保证查询的数据都是一致的,即使中间被其他事务插入了新数据。

  • 当前读模式下,通过 MySQL Innodb 中的间隙锁和临键锁解决幻读,当执行 select ... for update 时,会针对相关的记录或间隙进行加锁,如果有其他事务在修改相关数据,或在间隙中新增数据,都会被阻塞,直到当前事务处理完成后才能继续操作,进而规避了幻读的发生。

不过上面两种方式虽然解决了大多数情况下的幻读问题,但是某些个别情况下还是不可避免会发生幻读。

例如有如下表结构:

CREATE TABLE `user` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '姓名',
  `age` int DEFAULT NULL COMMENT '年龄',
  `grade` int DEFAULT NULL COMMENT '等级',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

写入两条测试数据:

INSERT INTO `testdb`.`user` (`id`, `name`, `age`, `grade`) VALUES (1, '张三', 18, 1);
INSERT INTO `testdb`.`user` (`id`, `name`, `age`, `grade`) VALUES (2, '李四', 18, 1);

二、可重复读隔离级别下幻读问题复现

首先在事务1中,查询 user 表下的所有数据:

BEGIN;
select * from `user`;

在这里插入图片描述
可以正常查到两条测试数据。

下面在事务2中插入一条新数据:

BEGIN;
INSERT INTO `user`(name,age,grade) value('王五', 18, 1);
COMMIT;

在这里插入图片描述

然后回到事务 1 ,当前如果继续执行查询,应该会命中先前查询的Read View

select * from `user`;

在这里插入图片描述
看到确实没有查出事务2新增的数据,但是下面在事务1中做一个更新操作,把所有 age > 15 的用户的 grade 修改成 2 ,然后再次执行上面相同的查询语句:

update `user` set grade = 2 where age > 15;
select * from `user`;

在这里插入图片描述
可以看到此时竟然查出了事务2新增的数据,对于事务1来说出现了幻读!

此时发生幻读主要在 update 执行后,首先之前的 select 属于快照读,不会对相关数据加锁,而 update 其实属于当前读,且 update 的范围,已经包含了事务2写入并提交的数据,所以导致后面的查询看到了新插入的数据。

同样的原理,将 update 语句换成 select .... for update 同样也会出现幻读。

三、如何解决幻读

从上面的例子可以看出,可重复读隔离级别并没有彻底解决幻读问题,只是尽可能最大程度的规避幻读的问题。其实有的时候我们可以从上层去协调这种问题,比如在代码层协调执行的过程。如果非要到SQL中解决,可以在最开始的 select 就加上 for update 或者 select ... in share mode,这样相关数据都被锁上了,其他事务的写操作就会被阻塞,缺点是处理的效率就会大大折扣,具体解决方法还是要结合业务决策。

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

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

相关文章

【最新华为ensp模拟器安装(内含文件下载)】

详细安装步骤 ensp介绍ensp安装需要的软件具体安装步骤查看virtualbox 配置信息是否正确ensp配置相关测试ensp安装是否成功教程亲测没问题,需要的同学点个关注呗。。。。 ensp介绍 ensp是华为路由交换模拟器,目前e.huawei.com上已经下载不到&#xff0c…

二、Flask会话技术和模板语言

Cookie Session # views.py: 路由 + 视图函数 import datetimefrom flask import Blueprint, render_template, request, redirect, session from .models import *# 蓝图 blue = Blueprint(user, __name__)# 首页 可以写两个路由,都是访问同一个函数 @blue.route(/) @blue.ro…

关于机器学习/深度学习的一些事-答知乎问(二)

进化算法与深度强化学习算法结合如何进行改进? (1)进化算法普遍存在着样本效率低下的问题,虽然其探索度较高,但其本质为全局随机性搜索,需要在整个回合结束后才能更新其种群,而深度强化学习在每…

普乐蛙VR航天体验馆设备VR太空飞船VR元宇宙展厅

三天小长假就要来啦!五一假期也即将到来。老板们想捉住人流量这个财富密码吗?那快快行动起来!开启VR体验项目,假期赚翻天!小编亲测!!这款设备刺激好玩,想必会吸引各位家长小孩、学生…

v-show和v-if的区别和使用场景(超级详细)

文章目录 一、v-show与v-if的共同点二、v-show与v-if的区别三、v-show与v-if原理分析# v-show原理v-if原理 四、v-show与v-if的使用场景参考文献 一、v-show与v-if的共同点 我们都知道在 vue 中 v-show 与 v-if 的作用效果是相同的(不含v-else),都能控制元素在页面…

LangChain-25 ReAct 让大模型自己思考和决策下一步 AutoGPT实现途径、AGI重要里程碑

背景介绍 大模型ReAct(Reasoning and Acting)是一种新兴的技术框架,旨在通过逻辑推理和行动序列的构建,使大型语言模型(LLM)能够达成特定的目标。这一框架的核心思想是赋予机器模型类似人类的推理和行动能…

js基础知识+练习

一,JavaScript简单了解 1.什么是JavaScript JavaScript简称JS,是较为流行的一种前端编程语言,是一种脚本语言,通过解释器运行,主要在客户端(浏览器)上运行,现在也可以基于node.js在服…

程序员的故事:麦哲伦死于JAVA之争

程序员的故事:麦哲伦死于JAVA之争 1400年,永乐年间,永乐皇帝七点钟准时上班了,清了清嗓子,问道:大家都到了没有?今天我们开个会,主要是讲一下项目用什么语言? 元朝的时候…

airtest-ios真机搭建实践

首先阅读4 ios connection - Airtest Project Docs 在Windows环境下搭建Airtest对iOS真机进行自动化测试的过程相对复杂,因为iOS的自动化测试通常需要依赖Mac OS系统,但理论上借助一些工具和服务,Windows用户也可以间接完成部分工作。下面是…

Python中的回调函数和C中函数指针什么关系?

你好,我是安然无虞。 Python 回调 在Python中,‘回调函数’ (callback) 是指一个作为参数传递给其它代码的函数。 目的是在后者完成某些操作后调用这个传递进来的函数。 回调允许在执行异步操作或处理事件时通知调用者代码。 回调函数通常用于&#…

家庭网络防御系统搭建-虚拟机安装siem/securityonion网络连接问题汇总

由于我是在虚拟机中安装的security onion,在此过程中,遇到很多的网络访问不通的问题,通过该文章把网络连接问题做一下梳理。如果直接把securityonion 安装在物理机上,网络问题则会少很多。 NAT无法访问虚拟机 security onion虚拟…

团结引擎+OpenHarmony 1配置篇

团结引擎OpenHarmony 1 配置篇 app团结鸿蒙化第一课一 DevEco Studio 下载安装二 团结引擎三 出包 app团结鸿蒙化第一课 1 团结引擎配置2 DevEco Studio 配置 一 DevEco Studio 下载安装 申请开发者套件 1 注册华为账号 签署协议 官网 2 认真填写 DevEco Studio 开发套件申请…

某网站sign签名参数与数据响应加密逆向分析

文章目录 1. 写在前面2. 接口分析3. 断点分析4. 扣代码 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力…

【吊打面试官系列】Java高并发篇 - Java 中你怎样唤醒一个阻塞的线程?

大家好,我是锋哥。今天分享关于 【Java 中你怎样唤醒一个阻塞的线程?】面试题,希望对大家有帮助; Java 中你怎样唤醒一个阻塞的线程? 在Java中,可以通过以下方式唤醒一个阻塞的线程: 使用Objec…

[dvwa] sql injection

sql injection 0x01 low sql语句没有过滤 经典注入,通过逻辑or为真相当于select * from users where true,99换成1也成 用union select 对齐列数,查看数据库信息 1’ union select 1,2# order by探测对齐列数更方便 1’ or 11 order b…

【网络安全】WebPack源码(前端源码)泄露 + jsmap文件还原

前言 webpack是一个JavaScript应用程序的静态资源打包器。它构建一个依赖关系图,其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个bundle。大部分Vue等项目应用会使用webpack进行打包,使用webpack打包应用程序会在网站js…

C语言 | Leetcode C语言题解之第28题找出字符串中第一个匹配项的下标

题目&#xff1a; 题解&#xff1a; int strStr(char* haystack, char* needle) {int n strlen(haystack), m strlen(needle);if (m 0) {return 0;}int pi[m];pi[0] 0;for (int i 1, j 0; i < m; i) {while (j > 0 && needle[i] ! needle[j]) {j pi[j - …

体验Humane AI:我与可穿戴AI别针的生活

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

使用Redis实现用户最近浏览记录

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 Redis是一个key-va…

算法库应用- 表的自然链接

功 能: 设计算法,将两个单链表数组的特定位序, 相同者,链接起来 编程人: 王涛 详细博客:https://blog.csdn.net/qq_57484399/article/details/127161982 时 间: 2024.4.14 版 本: V1.0 V1.0 main.cpp /***************************************** 功 能: 设计算法,将两个…