RR(Repeatable Read)级别如何防止幻读

在这里插入图片描述

在 MySQL 数据库事务隔离级别中,RR(可重复读) 通过 MVCC(多版本并发控制)锁机制 的组合策略来避免幻读问题。


一、MVCC机制:快照读与版本控制

  1. 快照读(Snapshot Read)

    • 每个事务启动时生成一个全局唯一的 事务版本号,所有 SELECT 操作基于该版本号读取数据的快照(历史版本),而非最新数据。
    • 快照规则
      • 仅读取 创建版本号 ≤ 当前事务版本号 的数据行。
      • 忽略 删除版本号 ≤ 当前事务版本号 或未标记删除的数据行。
    • 效果:同一事务内多次读取同一范围的数据时,结果一致(即使其他事务插入新数据并提交)。
  2. 版本更新规则

    • INSERT:新插入行的创建版本号设为当前事务版本号。
    • DELETE:标记删除行的删除版本号为当前事务版本号。
    • UPDATE:拆分为删除旧行(标记删除版本号)和插入新行(设置新创建版本号)。

二、锁机制:当前读与间隙锁

  1. 当前读(Current Read)

    • 对数据修改操作(UPDATE/INSERT/DELETE/SELECT FOR UPDATE),强制读取最新数据版本并加锁。
    • 锁类型
      • 记录锁(Row Lock):锁定单行数据。
      • 间隙锁(Gap Lock):锁定索引记录间的间隙,阻止其他事务插入新数据。
      • 临键锁(Next-Key Lock):记录锁 + 间隙锁的组合,锁定一个左开右闭的区间(如 (5, 10])。
  2. 间隙锁的作用

    • 防止范围插入:例如事务 A 查询 age BETWEEN 20 AND 30 的数据并加间隙锁,事务 B 尝试插入 age=25 的数据会被阻塞,直到事务 A 提交或回滚。
    • 覆盖索引与非唯一索引:即使查询条件未命中实际数据行,间隙锁仍会锁定符合条件的索引范围。

三、MySQL InnoDB 的特殊实现

  1. RR 与 Serializable 的折中

    • 快照读:通过 MVCC 避免幻读(如普通 SELECT 操作)。
    • 当前读:通过间隙锁强制串行化,阻止其他事务插入新数据。
    • 实际效果:在 MySQL 的 RR 级别下,几乎不会出现幻读(与标准 SQL 定义的 RR 存在差异)。
  2. 示例场景

    -- 事务 A
    START TRANSACTION;
    SELECT * FROM users WHERE age BETWEEN 20 AND 30; -- 快照读,无幻读
    UPDATE users SET name='Alice' WHERE age=25;      -- 当前读触发间隙锁
    -- 事务 B 插入 age=25 的数据;-- 因为间隙锁存在,阻塞事务 B 的插入
    COMMIT;
    
  3. mysql 幻读问题
    mysql幻读是通过MVCC和临键锁、间隙锁避免的,但在一些特殊场景下,还是会出现幻读问题:事务中快照读当前读同时存在时就会出现幻读问题

    -- 事务A
    BEGIN;
    SELECT * FROM users WHERE age > 20;  -- 快照读,未加锁
    -- 事务B插入age=25的数据并提交
    -- 事务A执行当前读
    SELECT * FROM users WHERE age > 20 FOR UPDATE;  -- 当前读,返回包含事务B插入的新数据,发生幻读
    

四、与其他数据库的对比

数据库RR 实现方式是否完全避免幻读
MySQL InnoDBMVCC + 间隙锁是(近似)
PostgreSQLMVCC(无间隙锁)
Oracle多版本读一致性(无间隙锁)

五、应用注意事项

  1. 显式加锁的必要性

    • 若需完全避免幻读,应在事务中对查询范围显式加锁(如 SELECT ... FOR UPDATE)。
    • 仅依赖快照读可能无法覆盖高并发场景下的严格一致性需求。
  2. 性能权衡

    • 间隙锁的代价:锁定范围可能降低并发写入性能。
    • 索引设计优化:合理设计索引(如唯一索引)可减少间隙锁的覆盖范围。

总结

MySQL 的 RR 隔离级别通过 MVCC 快照读间隙锁 的组合,在大多数场景下有效避免了幻读问题。其实现机制兼顾了性能与一致性,但需注意不同数据库的差异及实际业务中显式锁的使用需求。对于严格防幻读的场景,可升级至 Serializable 级别或通过应用层逻辑补充控制。

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

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

相关文章

Android运行时ART加载类和方法的过程分析

目录 一,概述 二,ART运行时的入口 一,概述 既然ART运行时执行的都是翻译DEX字节码后得到的本地机器指令了,为什么还需要在OAT文件中包含DEX文件,并且将它加载到内存去呢?这是因为ART运行时提供了Java虚拟机接口,而要实现Java虚…

Javase 基础加强 —— 02 泛型

本系列为笔者学习Javase的课堂笔记,视频资源为B站黑马程序员出品的《黑马程序员JavaAI智能辅助编程全套视频教程,java零基础入门到大牛一套通关》,章节分布参考视频教程,为同样学习Javase系列课程的同学们提供参考。 01 认识泛型…

Oracle VirtualBox 在 macOS 上的详细安装步骤

Oracle VirtualBox 在 macOS 上的详细安装步骤 一、准备工作1. 系统要求2. 下载安装包二、安装 VirtualBox1. 挂载安装镜像2. 运行安装程序3. 处理安全限制(仅限首次安装)三、安装扩展包(增强功能)四、配置第一个虚拟机1. 创建新虚拟机2. 分配内存3. 创建虚拟硬盘4. 加载系…

RAGFlow 接入企业微信应用实现原理剖析与最佳实践

背景 近期有医美行业客户咨询我们智能客服产品,期望将自己企业的产品、服务以及报价信息以企微应用的方式给到客户进行体验互动,提升企业运营效率。关于企业微信对接,我们分享下最佳实践,抛砖引玉。效果图如下: 这里也…

【心海资源】子比主题新增注册与会员用户展示功能模块及实现方法

内容改写: 本次分享的是子比主题顶部展示注册用户与会员信息的功能模块及其实现方式。 你可以通过两种方式启用该功能: 直接在后台进入“外观 → 小工具”启用该展示模块,操作简便;也可将提供的代码覆盖至子比主题目录中&#…

CSDN积分详解(介绍、获取、用途)

🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 积分**一、积分类型及用途****二、积分获取途…

【iview】es6变量结构赋值(对象赋值)

变量的解构赋值 以iview的src/index.js中Vue.prototype.$IVIEW改造为例练习下怎么使用变量的解构赋值 原来的写法: const install function(Vue, opts {}) {if (install.installed) return;locale.use(opts.locale);locale.i18n(opts.i18n);Object.keys(iview).fo…

【c++深入系列】:万字详解vector(附模拟实现的vector源码)

🔥 本文专栏:c 🌸作者主页:努力努力再努力wz 💪 今日博客励志语录: 种子破土时从不问‘会不会有光’,它只管生长 ★★★ 本文前置知识: 模版 1.什么是vector 那么想必大家都学过顺…

MySQL基础关键_007_DQL 练习

目 录 一、题目 二、答案(不唯一) 1.查询每个部门薪资最高的员工信息 2.查询每个部门高于平均薪水的员工信息 3. 查询每个部门平均薪资等级 4.查询部门中所有员工薪资等级的平均等级 5.不用分组函数 max 查询最高薪资 6.查询平均薪资最高的部门编…

Jenkis安装、配置及账号权限分配保姆级教程

Jenkis安装、配置及账号权限分配保姆级教程 安装Jenkins下载Jenkins启动Jenkins配置Jenkins入门Jenkins配置配置中文配置前端自动化任务流新建任务拉取代码打包上传云服务并运行配置后端自动化任务流新建任务拉取代码打包上传云服务并运行账号权限分配创建用户分配视图权限安装…

虚函数 vs 纯虚函数 vs 静态函数(C++)

🧩 一图看懂:虚函数 vs 纯虚函数 特性虚函数(Virtual)纯虚函数(Pure Virtual)语法virtual void foo();virtual void foo() 0;是否必须实现✅ 必须在类中实现❌ 不在基类实现,派生类必须实现是…

2025年渗透测试面试题总结-拷打题库36(题目+回答)

网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 2025年渗透测试面试题总结-拷打题库36 PHP代码常见入口函数查找 PHP框架路由方法熟悉度 PHP变量覆盖…

STL之vector容器

vector的介绍 1.vector是可变大小数组的容器 2.像数组一样,采用连续的空间存储,也就意味着可以通过下标去访问,但它的大小可以动态改变 3.每次的插入都要开空间吗?开空间就要意味着先开临时空间,然后在拷贝旧的到新…

[学成在线]22-自动部署项目

自动部署 实战流程 下边使用jenkins实现CI/CD的流程。 1、将代码使用Git托管 2、在jenkins创建任务,从Git拉取代码。 3、拉取代码后进行自动构建:测试、打包、部署。 首先将代码打成镜像包上传到docker私服。 自动创建容器、启动容器。 4、当有代…

74HC123的电路应用场景

74HC123的电路应用场景 **1. 引脚功能示例****2. 核心功能****(1)单稳态触发器****(2)双独立通道****(3)灵活触发方式** **3. 工作原理****4. 典型应用场景****(1)定时与延时控制***…

【人工智能】大模型安全的深度剖析:DeepSeek漏洞分析与防护实践

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着大语言模型(LLM)的广泛应用,其安全性问题日益凸显。DeepSeek作为中国领先的开源AI模型,以低成本和高性能著称,但近期暴露的数据库…

《ESP32音频开发实战:I2S协议解析与WAV音频录制/播放全指南》

前言 在智能硬件和物联网应用中,音频处理能力正成为越来越重要的功能——无论是语音交互、环境音采集,还是音乐播放,都离不开高效的音频数据传输与处理。而I2S(Inter-IC Sound)作为专为音频设计的通信协议&#xff0c…

大数据实时数仓的数据质量监控解决方案

实时数仓不仅仅是传统数据仓库的升级版,它更强调数据的实时性、流动性和高可用性,通过对海量数据的即时处理和分析,为企业提供近乎实时的洞察力。这种能力在金融、零售、制造、互联网等行业中尤为关键,例如,电商平台可以通过实时数仓监控用户行为,动态调整推荐算法;金融…

56认知干货:智能化产业

如果在不久的未来,一座高楼大厦的建设,只需将图纸输入系统,无数台机器人就能精准协作完成任务; 电影节的主角不再是人类,动漫与影视作品将不再需要人类创作; 当播种和收获的工作无人参与,所有过程都能自动化进行; 这将预示着我们将迎来一个智能化社会,在这个社会中,…

使用synchronized关键字同步Java线程

问题 在Java多线程编程中,你需要保护某些数据,防止多个线程同时访问导致数据不一致或程序错误。 解决方案 在需要保护的方法或代码段上使用synchronized关键字。 讨论 synchronized关键字是Java提供的同步机制,用于确保在同一时刻只有一…