温馨提示×

温馨提示×

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

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

快照读在MVCC中如何

发布时间:2026-09-30 10:39:20 来源:亿速云 阅读:101 作者:小樊 栏目:数据库

在 MVCC(多版本并发控制) 中,快照读(Snapshot Read) 是实现高并发、避免锁阻塞的关键机制。下面从概念、原理、实现方式和典型场景几个方面说明。


一、什么是快照读

快照读是指:

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

也就是说:

  • 读取的是 历史版本
  • 不会阻塞写操作
  • 写操作也不会阻塞读操作

典型例子(以 MySQL InnoDB 为例):

SELECT * FROM user WHERE id = 1;

二、MVCC 如何支持快照读

MVCC 通过以下机制实现快照读:

1. 隐藏字段(以 InnoDB 为例)

每行数据包含:

  • DB_TRX_ID:最后一次修改该行的事务 ID
  • DB_ROLL_PTR:回滚指针,指向 undo log 中的旧版本

2. Undo Log(回滚日志)

  • 每次更新都会生成旧版本
  • 旧版本链通过 roll_ptr 串联

3. Read View(一致性视图)

事务在快照读时生成 Read View,包含:

  • 当前活跃事务 ID 列表
  • 当前最大事务 ID
  • 当前最小事务 ID

三、快照读的可见性判断

事务在读取一行时,会判断该版本是否对自己可见:

规则简化版:

  1. 如果 DB_TRX_ID 是自己的事务 → 可见
  2. 如果 DB_TRX_ID 已提交且早于 Read View → 可见
  3. 如果 DB_TRX_ID 在活跃事务列表中 → 不可见,沿 undo log 找旧版本
  4. 一直找到可见版本或不存在

✅ 结果:

每个事务看到的是“自己开始那一刻”的一致性数据


四、快照读 vs 当前读

类型 读取内容 是否加锁 示例
快照读 历史版本 否 SELECT
当前读 最新版本 是 SELECT ... FOR UPDATE

当前读会绕过 MVCC,直接读最新并加锁。


五、快照读的优点

  • ✅ 读不阻塞写
  • ✅ 写不阻塞读
  • ✅ 避免脏读、不可重复读(RR 级别)
  • ✅ 提升并发性能

六、典型使用场景

  • 普通 SELECT
  • 报表查询
  • 大数据分析
  • 高并发读多写少系统

七、注意事项

  • 快照读依赖 事务隔离级别
    • READ COMMITTED:每次读生成新快照
    • REPEATABLE READ:事务内快照不变
  • 长事务可能导致 undo log 膨胀

如果你愿意,我也可以结合 MySQL / PostgreSQL / Oracle 的具体实现来对比说明。

向AI问一下细节

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

AI
助
手