news 2026/6/15 17:28:36

什么是当前读和快照读?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
什么是当前读和快照读?

在 MySQL InnoDB 中,当前读快照读是 MVCC 机制下的两种数据读取方式,核心区别在于是否读取最新版本、是否加锁、是否受其他事务影响,二者分工协作实现了 “读写不阻塞” 的高效并发。

一、快照读(Snapshot Read)

核心定义:读取数据的历史版本快照,不走锁机制,完全基于 MVCC 实现。

  • 本质:读的是 Undo Log 中存储的历史版本,而非数据页的最新版本。
  • 加锁情况无锁,不会阻塞任何写操作,也不会被写操作阻塞。
  • 适用场景:普通的SELECT查询(不加任何锁定子句)。
  • 隔离级别影响
    • 读已提交(RC):每次SELECT都会生成新的 Read View,可能读到其他事务已提交的最新版本(不可重复读)。
    • 可重复读(RR):整个事务内共用第一次SELECT生成的 Read View,保证多次读取结果一致。

生活化比喻:你去图书馆查资料,不想等别人归还原版书,直接拿了一本影印版(历史快照)阅读,影印版内容不受原版后续修改影响。

-- 这是典型的快照读 SELECT name FROM user WHERE id = 1;

在之前的事务协作案例中,事务 A 在 T2、T5、T7 执行的SELECT都是快照读,读取的是 Undo Log 里的历史版本(name="张三"),完全不受事务 B 写操作的影响。

二、当前读(Current Read)

核心定义:读取数据的最新版本,且会对读取的记录加锁,保证后续写操作的一致性。

  • 本质:读的是数据页的最新版本,需要借助锁机制防止并发冲突。
  • 加锁情况必须加锁,根据操作类型加不同的锁(如行级排他锁、共享锁)。
  • 适用场景:所有会修改数据的操作 + 显式加锁的查询,包括:
    1. INSERT/UPDATE/DELETE:修改数据前必须读最新版本,加排他锁(X 锁)。
    2. 显式锁定读:SELECT ... FOR UPDATE(加排他锁)、SELECT ... LOCK IN SHARE MODE(加共享锁)。

生活化比喻:你要修改图书馆的原版书,必须先拿到原版(最新版本),并且拿到后会给书贴个 “正在修改” 的标签(加锁),防止别人同时修改。

-- 显式加排他锁的当前读,读最新版本 SELECT name FROM user WHERE id = 1 FOR UPDATE; -- UPDATE 操作隐含当前读,先读最新版本再加锁修改 UPDATE user SET name = "王五" WHERE id = 1;

在之前的案例中,事务 B 的UPDATE和事务 A 的SELECT ... FOR UPDATE都是当前读,必须读取最新版本(name="李四"),并且加锁防止冲突。

三、当前读 vs 快照读 核心对比表

特性快照读当前读
读取版本历史版本(Undo Log 快照)最新版本(数据页当前数据)
加锁情况无锁必须加锁(X 锁 / S 锁)
阻塞情况不阻塞写,也不被写阻塞加 X 锁会阻塞其他写操作,被其他 X 锁阻塞
适用 SQL普通SELECTINSERT/UPDATE/DELETESELECT ... FOR UPDATE
依赖机制MVCC(Read View + Undo Log)锁机制 + MVCC(仅读取最新版本,不依赖快照)
隔离级别支持支持 RC、RR支持所有隔离级别

四、关键补充

  1. 为什么当前读不需要 MVCC 快照?当前读的目标是获取最新数据并修改,必须保证数据的 “实时性”,如果读历史版本会导致脏写(比如基于旧版本修改,覆盖了别人的新修改)。因此当前读会跳过 MVCC 的版本链,直接读取最新版本并加锁。

  2. 串行化隔离级别下的特殊情况SERIALIZABLE(串行化)隔离级别下,普通SELECT也会被升级为当前读(隐式加共享锁),此时不再有快照读,所有操作串行执行,完全靠锁保证一致性,并发性能会大幅下降。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/13 2:11:41

JAVA进阶 THREAD学习12 多线程小结

多线程安全问题的应对 首先有前面的分析得出多线程的安全问题是由共享资源的修改混乱导致的。 那么我们根据这两个关键的点做出应对: 避开使用共享资源 使用没有共享资源的模型 避开修改 对共享资源只读不写使用不可修改的内容 直接应对线程安全问题 原子性顺序性可…

作者头像 李华
网站建设 2026/6/12 20:15:43

Go Web框架全面对比:哪一款最适合你的项目?

Go语言(Golang)自发布以来,以其简洁的语法、高效的性能以及出色的并发支持,成为了现代Web开发中一个重要的选择。Go本身是一个非常强大的语言,但由于Go的标准库并不提供一个“完整”的Web框架,许多社区开发…

作者头像 李华
网站建设 2026/6/12 0:05:35

Java开发的AI应用框架简述——LangChain4j、Spring AI、Agent-Flex

LangChain4j LangChain4j官网 star很多,文档齐全,在AI服务中,提供了丰富的功能,示例代码丰富。 简介 是一个功能丰富、易于使用的Java AI开发框架,特别适合需要快速集成和使用大型语言模型的Java开发者。 项目特点 …

作者头像 李华
网站建设 2026/6/15 14:30:18

基于 ANFIS 的非线性回归(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

作者头像 李华
网站建设 2026/5/22 11:07:27

FastAPI 路径操作依赖项

FastAPI 路径操作依赖项 引言 FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,由 Python 3.6+ 支持并基于标准 Python 类型提示。依赖项是 FastAPI 中一个强大的特性,它允许我们在请求处理期间执行各种操作,例如身份验证、数据验证、权限检查等。本文将深入…

作者头像 李华
网站建设 2026/6/15 15:47:20

亲测好用10个AI论文工具,专科生轻松搞定论文写作!

亲测好用10个AI论文工具,专科生轻松搞定论文写作! AI 工具助力论文写作,专科生也能轻松应对 在如今的学术环境中,AI 工具正逐渐成为学生和研究者不可或缺的助手。尤其是在论文写作过程中,AI 不仅能够帮助提高效率&…

作者头像 李华