温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

MVCC快照读是什么概念

发布时间:2026-09-09 22:19:06 来源:亿速云 阅读:97 作者:小樊 栏目:数据库

**MVCC 快照读(Snapshot Read)**是数据库(尤其是 MySQL InnoDB)中一种基于 多版本并发控制(MVCC,Multi-Version Concurrency Control) 的读取方式。

下面用通俗的方式解释这个概念。


一、什么是 MVCC

MVCC 的核心思想是:

对一行数据的修改不直接覆盖旧值,而是保留多个版本,读和写互不阻塞。

每条记录在 InnoDB 中通常会有:

  • 创建版本号(事务 ID)
  • 删除版本号(事务 ID)
  • 回滚指针(指向旧版本)

这样,不同事务在同一时刻可以看到不同“版本”的数据。


二、什么是快照读(Snapshot Read)

快照读:

事务在读取数据时,读取的是事务开始时的数据快照(一致性视图),而不是最新提交的数据。

也就是说:

  • 快照读 不会加锁
  • 快照读 不会被其他事务的写阻塞
  • 快照读看到的是“某个时间点的数据状态”

三、快照读是怎么工作的(简化版)

以 MySQL InnoDB 为例:

  1. 事务启动时,会生成一个 Read View(一致性视图)
  2. 读数据时:
    • 如果某行数据的修改事务 在当前事务之后提交 → 不可见
    • 如果修改事务 已提交且在快照之前 → 可见
  3. 通过 undo log 找到对应版本的数据返回

四、快照读 vs 当前读

对比项 快照读 当前读
是否加锁 否 是
读的是什么 历史快照 最新数据
例子 SELECT SELECT ... FOR UPDATE
是否可能被阻塞 否 是

示例:

-- 快照读
SELECT * FROM user WHERE id = 1;

-- 当前读
SELECT * FROM user WHERE id = 1 FOR UPDATE;

五、为什么要快照读

✅ 提高并发性能
✅ 避免读阻塞写、写阻塞读
✅ 实现 可重复读(RR) 和 读已提交(RC)


六、典型使用场景

  • 普通 SELECT 查询
  • 报表查询
  • 不要求实时一致性的读操作

七、一句话总结

MVCC 快照读就是:在不加锁的情况下,读取事务开始那一刻的数据“照片”,实现高并发、非阻塞读。

如果你愿意,我也可以结合 InnoDB 的 Read View 实现细节 或 和幻读的关系 再深入讲。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手