当前位置: 首页 > news >正文

mysql的快照读和当前读

在 MySQL InnoDB 存储引擎中,快照读(Snapshot Read) 和 当前读(Current Read) 是两种核心的读操作模式,二者的设计目标、实现方式、加锁行为和适用场景截然不同,其中快照读是 MVCC 机制的核心体现,当前读则依赖锁机制保证数据一致性。

一、快照读(Snapshot Read)
  1. 定义
    快照读是指读取数据的历史版本(快照),而非数据的最新版本,是 InnoDB 实现 MVCC 多版本并发控制的核心读方式。
  2. 核心特征
  • 无锁读取:读取时不加任何行锁 / 表锁,完全避免锁竞争,读写互不阻塞(读不阻塞写,写不阻塞读);
  • 依赖 MVCC:通过「行版本链 + Read View」判断数据可见性,只读取符合当前事务隔离级别的历史版本;
  • 版本一致性:在不同隔离级别下,快照读的版本可见性规则不同(如可重复读级别下,事务内多次快照读复用同一个 Read View,保证结果一致)。
  1. 适用场景
    所有普通的 SELECT 语句(无特殊锁提示)都属于快照读,例如:
SELECT*FROMuserWHEREid=1;SELECTnameFROMuserWHEREage>20;
  1. 典型行为(以可重复读为例)
    假设事务 A 执行快照读读取 id=1 的数据(值为 Tom),此时事务 B 修改该数据为 Jerry 并提交,但事务 A 后续的快照读仍会读取到 Tom(因为复用第一次生成的 Read View,看不到事务 B 提交的新版本)。
二、当前读(Current Read)
  1. 定义
    当前读是指读取数据的最新版本,且读取时会对目标数据加锁(行锁 / 间隙锁),防止其他事务修改该数据,保证读取和后续操作的原子性。
  2. 核心特征
  • 加锁读取:读取最新版本的同时,会为数据加锁(排他锁 / 共享锁),阻塞其他事务的写操作或当前读操作;
  • 不依赖 MVCC:直接读取最新版本,无视版本链和 Read View;
  • 强一致性:保证读取到的是数据的最新状态,适用于需要精准操作最新数据的场景。
  1. 适用场景
    以下操作均属于当前读:
操作类型示例加锁类型
加锁的SELECTSELECT * FROM user WHERE id = 1 FOR UPDATE;排他锁(X 锁),阻塞其他写操作和 FOR UPDATE 操作
加锁的 SELECTSELECT * FROM user WHERE id = 1 LOCK IN SHARE MODE;共享锁(S 锁),阻塞其他排他锁操作,允许共享锁操作
写操作(隐式当前读)INSERT INTO user (name) VALUES (‘Tom’);排他锁(插入行加锁)
写操作(隐式当前读)UPDATE user SET name = ‘Jerry’ WHERE id = 1;先对目标行加排他锁,再读取最新版本并修改
写操作(隐式当前读)DELETE FROM user WHERE id = 1;先对目标行加排他锁,再读取最新版本并标记删除
  1. 典型行为
    假设事务 A 执行 SELECT * FROM user WHERE id = 1 FOR UPDATE;(当前读),此时会读取 id=1 的最新版本并加排他锁:
  • 事务 B 若执行 UPDATE user SET name = ‘Jack’ WHERE id = 1;,会被阻塞,直到事务 A 提交 / 回滚;
  • 事务 B 若执行普通 SELECT(快照读),仍可读取到历史版本(不受当前读锁的影响)。
三、快照读 vs 当前读 核心对比
维度快照读当前读
读取数据版本历史版本(快照)最新版本
加锁行为无锁加行锁 / 间隙锁(排他 / 共享)
依赖机制 MVCC(版本链 + Read View)锁机制(行锁、Next-Key Lock)
并发特性读写不阻塞,性能高读阻塞写(排他锁),写阻塞读,性能较低
隔离性保证可重复读 / 读已提交(依赖隔离级别)串行化级别的强一致性
适用场景普通查询,追求并发性能精准操作最新数据(如更新 / 删除前校验、加锁查询)
典型语句SELECT …(无锁提示) SELECT … FOR UPDATE/INSERT/UPDATE/DELETE
四、关键补充说明
  1. 隔离级别的影响:
  • 读未提交(READ UNCOMMITTED):无快照读,直接读取最新版本(等价于当前读),会出现脏读;
  • 串行化(SERIALIZABLE):快照读被降级为当前读(加锁),所有读操作都加锁,完全串行执行。
  1. 写操作的隐式当前读:
  • INSERT/UPDATE/DELETE 执行时,会先触发「当前读」读取最新版本的数据,再执行写操作,确保修改的是最新数据,避免丢失更新。
  1. 锁的范围:
  • 当前读的加锁范围不仅包含匹配的行,还可能包含间隙(Next-Key Lock),防止幻读(可重复读级别下)。

总结

  • 快照读是 InnoDB 高并发的核心,通过 MVCC 实现无锁读,牺牲 “最新性” 换取性能;
  • 当前读是保证数据强一致性的手段,通过加锁读取最新版本,牺牲 “并发性” 换取准确性;
  • 日常开发中,普通查询用快照读即可,需要精准操作最新数据(如秒杀、库存扣减)时,需用当前读(如 SELECT … FOR UPDATE)。
http://www.jsqmd.com/news/83590/

相关文章:

  • 2026年速通前端面试题1000道,适用于99%的中大厂。少走弯路
  • 永磁同步电机无传感器控制算法:基于改进卡尔曼滤波速度观测器Simulink模型的高精度实现与普...
  • 2025年品牌命名机构推荐:权威榜单TOP5机构深度解析 - 品牌推荐
  • 如何区分应用所在的运行环境:物理机、虚拟机、容器还是 K8s?
  • HEV混动整车模型:主机厂基于Simulink 的混动整车仿真策略模型,包含控制器、发动机、电...
  • 深入解析:【Java EE进阶 --- SpringBoot】AOP原理
  • 2025年12月工业洗衣机,专业工业洗衣机,工业洗衣机设备公司推荐:行业测评与洗涤设备选择指南 - 品牌鉴赏师
  • ComfyUI如何实现图像质量自动评分?集成CLIP Score
  • 【后端】【架构】企业服务治理平台架构:从0到1构建统一治理方案
  • 十五、公文写作(汇报提纲)
  • 新来的外包,限流算法用的这么6
  • 黑客网站整理大全,收藏这一篇就够了
  • 破局 AI 落地难:JBoltAI 以全链路保障体系,让企业智能转型从蓝图照进现实
  • 风储调频在Matlab/Simulink中的探索:基于四机两区系统的实践
  • ShellCheck终极指南:快速提升Shell脚本质量的免费神器
  • 改善深层神经网络 第一周:深度学习的实践(五)归一化
  • 学Simulink--基于高比例可再生能源渗透的复杂电网建模场景实例:新能源高渗透下传统同步机主导系统的动态响应建模
  • 数据结构与算法11种排序算法全面对比分析
  • IEC 61400-1-2019风电设计标准:5大核心要点完整解析与快速掌握指南
  • 毕设开源 深度学习YOLO交通路面缺陷检测系统(源码+论文)
  • copyparty实战指南:零基础搭建个人文件共享服务器的完整教程
  • 2025年12月厦门岛外搬家,厦门搬家搬厂,厦门拉货搬家公司推荐:行业测评与选择指南 - 品牌鉴赏师
  • 打CTF,逆向分析攻略!一篇文章给你讲清楚逆向分析和破解技巧!
  • 2025年12月厦门搬家搬迁,厦门跨省拉货搬家,思明搬家公司推荐:聚焦企业综合实力与服务竞争力 - 品牌鉴赏师
  • 破局 AI 选择焦虑:以生态之力,找准低风险高价值的转型航向
  • 第三方专业洁净环境检测机构推荐指南TOP5(2025年版) - 品牌推荐大师
  • Java+Playwright自动化测试-30- 操作单选和多选按钮 - 番外篇(详细教程)
  • 破局数智化转型困境:JBoltAI 为传统企业点亮 AI 升级之路
  • 2026的网络安全行业前景如何?还能入行分蛋糕吗?
  • 记录一次USB虚拟网络问题排查