mysql中如何保证没有幻读发生
在 MySQL 中,幻读(Phantom Read)是指在一个事务中,两次相同的查询返回了不同的结果集,通常是由于其他事务插入或删除了符合查询条件的数据。为了保证没有幻读,MySQL 主要通过 事务隔离级别 和 锁机制 来实现。
1. 事务隔离级别
MySQL 支持四种事务隔离级别,不同隔离级别对幻读的解决程度不同:
| 隔离级别 | 脏读(Dirty Read) | 不可重复读(Non-Repeatable Read) | 幻读(Phantom Read) |
|---|---|---|---|
| 读未提交(Read Uncommitted) | 可能 | 可能 | 可能 |
| 读已提交(Read Committed) | 不可能 | 可能 | 可能 |
| 可重复读(Repeatable Read) | 不可能 | 不可能 | 可能(MySQL 中不可能) |
| 串行化(Serializable) | 不可能 | 不可能 | 不可能 |
-
可重复读(Repeatable Read) 是 MySQL 的默认隔离级别,在该级别下,MySQL 通过 MVCC(多版本并发控制) 和 Next-Key Lock 机制避免了幻读。
-
串行化(Serializable) 通过强制事务串行执行来避免幻读,但性能较差。
2. MVCC(多版本并发控制)
MVCC 是 MySQL 实现可重复读隔离级别的核心机制。它通过以下方式避免幻读:
-
版本链:
-
每行数据都有多个版本,每个版本包含一个创建时间(事务 ID)和删除时间(事务 ID)。
-
事务只能看到在它开始之前已经提交的数据版本。
-
-
快照读(Snapshot Read):
-
在可重复读隔离级别下,事务在第一次读取数据时会创建一个快照。
-
后续的读取操作都基于这个快照,因此不会看到其他事务插入的新数据。
-
3. Next-Key Lock
Next-Key Lock 是 MySQL 在可重复读隔离级别下避免幻读的锁机制。它是 记录锁(Record Lock) 和 间隙锁(Gap Lock) 的结合。
3.1 记录锁(Record Lock)
-
锁定索引中的某一条记录。
-
防止其他事务修改或删除该记录。
3.2 间隙锁(Gap Lock)
-
锁定索引记录之间的间隙,防止其他事务在间隙中插入新数据。
-
例如,如果表中有记录
1, 3, 5,间隙锁会锁定(-∞, 1)、(1, 3)、(3, 5)和(5, +∞)。
3.3 Next-Key Lock
-
结合记录锁和间隙锁,锁定记录及其前后的间隙。
-
例如,对于记录
3,Next-Key Lock 会锁定(1, 3]。
示例
假设有一个表 t,数据如下:
id --- 1 3 5
执行以下查询:
SELECT * FROM t WHERE id > 1 AND id < 5 FOR UPDATE;
-
MySQL 会锁定
(1, 3]和(3, 5),防止其他事务插入id为2或4的记录。 -
这样,在当前事务中再次执行相同的查询时,不会出现幻读。
4. 如何避免幻读
4.1 使用可重复读隔离级别
-
默认情况下,MySQL 的可重复读隔离级别通过 MVCC 和 Next-Key Lock 避免了幻读。
4.2 显式加锁
-
使用
SELECT ... FOR UPDATE或SELECT ... LOCK IN SHARE MODE对查询结果加锁。 -
例如:
SELECT * FROM t WHERE id > 1 AND id < 5 FOR UPDATE;
这样会锁定符合条件的记录及其间隙,防止其他事务插入新数据。
4.3 使用串行化隔离级别
-
串行化隔离级别通过强制事务串行执行来避免幻读,但会显著降低并发性能。
5. 总结
MySQL 主要通过以下机制避免幻读:
-
可重复读隔离级别:默认情况下通过 MVCC 和 Next-Key Lock 避免幻读。
-
Next-Key Lock:锁定记录及其间隙,防止其他事务插入新数据。
-
显式加锁:通过
FOR UPDATE或LOCK IN SHARE MODE显式加锁,进一步避免幻读。
在实际开发中,建议使用默认的 可重复读隔离级别,并结合业务需求选择合适的锁机制来避免幻读。
相关文章:
mysql中如何保证没有幻读发生
在 MySQL 中,幻读(Phantom Read)是指在一个事务中,两次相同的查询返回了不同的结果集,通常是由于其他事务插入或删除了符合查询条件的数据。为了保证没有幻读,MySQL 主要通过 事务隔离级别 和 锁机制 来实现…...
Golang实践录:go发布版本信息收集
go发布版本信息收集。 背景 本文从官方、网络资料收罗有关go的发布历史概况。主要目的是能快速了解golang不同版本的变更。鉴于官方资料为英文,为方便阅读,使用工具翻译成中文,重要特性参考其它资料补充/修改。由于发布版本内容较多…...
字节跳动AI原生编程工具Trae和百度“三大开发神器”AgentBuilder、AppBuilder、ModelBuilder的区别是?
字节跳动AI编程工具Trae与百度"三大开发神器"(AgentBuilder、AppBuilder、ModelBuilder)在定位、功能架构和技术路线上存在显著差异,具体区别如下: 一、核心定位差异 Trae:AI原生集成开发环境(AI…...
【UCB CS 61B SP24】Lecture 21: Data Structures 5: Priority Queues and Heaps 学习笔记
本文介绍了优先队列与堆,分析了最小堆的插入与删除过程,并用 Java 实现了一个通用类型的最小堆。 1. 优先队列 1.1 介绍 优先队列是一种抽象数据类型,其元素按照优先级顺序被处理。不同于普通队列的先进先出(FIFO)&…...
mapbox高阶,结合threejs(threebox)添加三维球体
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️threebox Sphere静态对象二、🍀使用t…...
QEMU源码全解析 —— 块设备虚拟化(1)
本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 详解全虚拟半虚拟及硬件辅助虚拟化技术-百度开发者中心 特此致谢! 序言 本专栏之前的系列文章,讲了很多QEMU/KVM相关知识,其中一部分内容是设备的虚拟…...
IDEA中Git版本回退终极指南:Reset与Revert双方案详解
目录 前言一、版本回退前置知识二、Reset方案:整体改写历史1、IDEA图形化操作(推荐)1.1、查看提交历史1.2、选择目标版本1.3、选择回退模式1.3.1、Soft(推荐)1.3.2、Mixed1.3.3、Hard(慎用)1.3.…...
Flutter 学习之旅 之 flutter 使用 flutter_screenutil 简单进行屏幕适配
Flutter 学习之旅 之 flutter 使用 flutter_screenutil 简单进行屏幕适配 目录 Flutter 学习之旅 之 flutter 使用 flutter_screenutil 简单进行屏幕适配 一、简单介绍 二、简单介绍 flutter_screenutil 三、安装 carousel_slider 四、简单案例实现 五、关键代码 六、补…...
实验一:在Windows 10/11下配置和管理TCP/IP
目录 1.【实训目标】 2.【实训环境】 3.【实训内容】 4.【实训步骤】 1.【实训目标】 1.了解网络基本配置中包含的协议、服务、客户端。 2.了解Windows支持的网络协议及参数设置方法。 3.掌握TCP/IP协议的配置。 2.【实训环境】 硬件环境:每人一台计算机&a…...
基于hive的电信离线用户的行为分析系统
标题:基于hive的电信离线用户的行为分析系统 内容:1.摘要 随着电信行业的快速发展,用户行为数据呈现出海量、复杂的特点。为了深入了解用户行为模式,提升电信服务质量和精准营销能力,本研究旨在构建基于 Hive 的电信离线用户行为分析系统。通…...
Rust WebAssembly 入门教程
一、开发环境搭建 1. 基础工具安装 # 安装 Rust curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh# 安装 wasm-pack cargo install wasm-pack# 安装开发服务器 cargo install basic-http-server# 安装文件监听工具 cargo install cargo-watch2. VSCode 插件安装…...
部署RabbitMQ集群详细教程
部署RabbitMQ集群详细教程 下面是一份在 Ubuntu 环境下部署 RabbitMQ 集群的详细步骤说明,涉及主机名设置、Erlang & RabbitMQ 安装、管理插件启用、集群通信 Cookie 配置、节点加入集群、镜像队列策略设置以及集群验证等。为了演示方便,以下示例假…...
20250306JIRA添加企业微信邮箱通知
文章目录 一,参考链接如下二,补充内容1,登录企业邮箱2,设置密码3,设置收发信设置 一,参考链接如下 参考链接:https://blog.csdn.net/icett/article/details/142520823 二,补充内容…...
代码随想录算法训练营第五十七天 | 101. 孤岛的总面积 102. 沉没孤岛 103. 水流问题 104.建造最大岛屿
101. 孤岛的总面积 题目链接:KamaCoder 文档讲解:代码随想录 状态:AC Java代码: import java.util.*;class Main {static int count 0;static int res 0;static boolean island true;public static int[][] dir new int[][]{…...
llamafactory大模型微调教程(周易大模型案例)
1.环境说明 操作系统:ubuntu 20 基础模型:Qwen2.5-1.5B-Instruct 工具:llamafactory GPU:四张4090 2、环境部署 2.1 下载基础模型 # 1、下载 modelscope pip install modelscope#2、模型下载 cd /data/ cat >> download…...
excel 斜向拆分单元格
右键-合并单元格 右键-设置单元格格式-边框 在设置好分割线后,你可以开始输入文字。 需要注意的是,文字并不会自动分成上下两行。 为了达到你期望的效果,你可以通过 同过左对齐、上对齐 空格键或使用【AltEnter】组合键来调整单元格中内容的…...
【JAVA架构师成长之路】【JVM实战】第2集:生产环境内存飙高排查实战
课程标题:生产环境内存飙高排查实战——从堆转储到代码修复的15分钟指南 目标:掌握内存泄漏与OOM问题的系统性排查方法,快速定位代码或配置缺陷 0-1分钟:问题引入与核心现象 线上服务内存持续增长,触发频繁Full GC甚至OOM(OutOfMemoryError),导致服务崩溃。常见诱因:…...
MATLAB实现遗传算法优化风电_光伏_光热_储热优化
1. 问题定义 目标:最小化输出负荷与需求负荷的偏差平方和。决策变量:每个时间步长的风电、光伏、光热和储热输出功率。约束条件: 风电、光伏、光热的输出功率不得超过其最大容量。储热系统的输出功率(充放电)不得超过…...
JCRQ1河马算法+四模型对比!HO-CNN-GRU-Attention系列四模型多变量时序预测
JCRQ1河马算法四模型对比!HO-CNN-GRU-Attention系列四模型多变量时序预测 目录 JCRQ1河马算法四模型对比!HO-CNN-GRU-Attention系列四模型多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于HO-CNN-GRU-Attention、CNN-GRU-Attent…...
react中的fiber和初次渲染
源码中定义了不同类型节点的枚举值 组件类型 文本节点HTML标签节点函数组件类组件等等 src/react/packages/react-reconciler/src/ReactWorkTags.js export const FunctionComponent 0; export const ClassComponent 1; export const IndeterminateComponent 2; // Befo…...
摆脱论文困扰!2026年实打实好用的专业降AI率平台
2026年论文降AI率工具已从“基础改写”升级为智能优化系统,核心评价维度包括AIGC识别精准度、文本自然度、学术格式合规性、查重适配能力、长文本逻辑性和多语种支持。本次测评覆盖6款主流工具,涵盖中文与英文、全流程与专项功能、免费与付费模式&#x…...
Transformers音频分类终极指南:3步实现智能环境音识别
Transformers音频分类终极指南:3步实现智能环境音识别 【免费下载链接】transformers huggingface/transformers: 是一个基于 Python 的自然语言处理库,它使用了 PostgreSQL 数据库存储数据。适合用于自然语言处理任务的开发和实现,特别是对于…...
LeetCode知识点总结 - 524
LeetCode 524. Longest Word in Dictionary through Deleting考点难度ArrayMedium题目 Given a string s and a string array dictionary, return the longest string in the dictionary that can be formed by deleting some of the given string characters. If there is mor…...
大麦抢票自动化工具:3分钟提升10倍成功率的技术秘籍
大麦抢票自动化工具:3分钟提升10倍成功率的技术秘籍 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 你是否经历过这样的场景?…...
macOS玩家必备:OpenClaw+nanobot自动化办公实战
macOS玩家必备:OpenClawnanobot自动化办公实战 1. 为什么选择OpenClawnanobot组合? 作为一个长期在macOS上折腾自动化工具的老用户,我一直在寻找一个既能保持本地数据隐私,又能灵活处理办公场景的解决方案。直到遇到OpenClawnan…...
低成本AI助手方案:OpenClaw+Qwen3-32B私有镜像替代GPT-4
低成本AI助手方案:OpenClawQwen3-32B私有镜像替代GPT-4 1. 为什么选择本地化AI助手 去年冬天,当我第37次收到OpenAI API的账单时,手指悬在支付按钮上迟迟按不下去——单月$127的支出已经超出了个人项目的预算红线。作为一个独立开发者&…...
3步打造专属音乐库:开源工具解锁无损音质体验
3步打造专属音乐库:开源工具解锁无损音质体验 【免费下载链接】lxmusic- lxmusic(洛雪音乐)全网最新最全音源 项目地址: https://gitcode.com/gh_mirrors/lx/lxmusic- 作为一款功能强大的开源音乐资源工具,洛雪音乐音源整合了全网海量音乐资源&am…...
如何高效解析和生成PSD文件:Ag-PSD库完整指南
如何高效解析和生成PSD文件:Ag-PSD库完整指南 【免费下载链接】ag-psd Javascript library for reading and writing PSD files 项目地址: https://gitcode.com/gh_mirrors/ag/ag-psd 在当今数字设计工作流中,Photoshop文档(PSD&#…...
Canvas Quest商业人像生成应用:电商模特图低成本自动化生产方案
Canvas Quest商业人像生成应用:电商模特图低成本自动化生产方案 1. 电商模特图的痛点与机遇 电商行业有个公开的秘密:商品展示图的拍摄成本往往比商品本身还高。特别是服装、配饰和美妆类目,每季新品需要拍摄上百套模特图,传统方…...
微信小程序集成通义千问:打造悬浮窗智能对话助手
1. 为什么要在微信小程序里集成通义千问? 最近两年AI对话助手火得一塌糊涂,但大部分应用都是独立APP或者网页版。其实对于很多轻量级场景来说,直接在微信小程序里集成AI助手反而更实用。想象一下,当你在小程序里购物遇到问题时&am…...
