跳到正文
Elaine Blog
返回

MVCC、Read View 与一致性读

MyBatis、MySQL 与数据架构

MVCC 让读者按可见性规则读取合适的行版本,从而减少普通读写之间的阻塞。它不是“完全无锁”,也不是把整张表复制一份快照。

Table of contents

Open Table of contents

三个组成部分

MVCC 是 Multi-Version Concurrency Control,多版本并发控制。InnoDB 会为聚簇索引记录维护事务相关隐藏信息,并把旧值保存在 Undo 记录形成的版本链中。Read View 是一次读取用来判断哪些事务版本可见的规则集合。

当前行版本 ──指向──> 较旧 Undo 版本 ──> 更旧版本

      └─ Read View 判断当前事务应该看到哪一个

它不是按时间戳简单比较。理解源码细节前,先牢牢记住:读视图、事务 ID 和版本链共同决定可见性。

快照读与当前读

普通 SELECT 通常是一致性快照读,可能沿 Undo 链找到旧版本;SELECT ... FOR UPDATEUPDATEDELETE 需要基于较新的可锁定记录工作,属于当前读。不要把同一事务中两类读的结果差异误判为缓存故障。

READ COMMITTED 下,普通查询通常每条语句建立新快照;在默认 REPEATABLE READ 下,同一事务的普通一致性读通常复用首次建立的快照。具体边界以官方版本文档与实验为准。

长事务为何危险

只要旧快照仍可能需要历史版本,Purge 就不能清掉相应 Undo。长事务会让历史链增长、读放大、表空间膨胀,并增加锁和复制风险。连接“空闲”不代表事务已经结束。

生产中应监控活动事务年龄、Undo 历史长度、长查询和未提交连接;批任务按可恢复批次提交;不要在事务内等待消息或人工操作。

参考 InnoDB 多版本机制

下一步

继续阅读06-12 Redo、Undo、Binlog 与崩溃恢复,把可见性扩展到持久化和复制。


分享这篇文章:

上一篇
InnoDB 锁、死锁与锁等待
下一篇
Redo、Undo、Binlog 与崩溃恢复