温馨提示×

温馨提示×

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

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

MVCC如何保证数据一致

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

MVCC(Multi-Version Concurrency Control,多版本并发控制)是数据库(如 MySQL InnoDB、PostgreSQL、Oracle 等)用来在保证高并发的同时,维持数据一致性和事务隔离性的核心机制。

下面从“它要解决什么问题 → 核心原理 → 如何保证一致性”三个层次说明。


一、MVCC 要解决什么问题

在并发场景下:

  • 多个事务同时读、写同一数据
  • 如果直接加锁,性能很差
  • 如果完全不加控制,会出现脏读、不可重复读、幻读

MVCC 的目标:

让“读不阻塞写,写不阻塞读”,同时保证事务看到的数据是一致的


二、MVCC 的核心思想

一句话:保存数据的多个版本,让不同事务看到不同时间点的数据快照

关键组成部分(以 MySQL InnoDB 为例):

1. 隐藏字段

每行记录包含:

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

2. Undo Log(回滚日志)

  • 每次更新,旧版本数据写入 undo log
  • 形成一条“版本链”

3. 事务 ID 与 ReadView

  • 每个事务有唯一递增的 trx_id
  • 事务开始时生成 ReadView(读视图),决定:
    • 哪些版本“对我可见”
    • 哪些版本“对我不可见”

三、MVCC 如何保证数据一致性

1. 读一致性(快照读)

普通 SELECT 是 快照读:

  • 事务只能看到:
    • 自己开始之前已提交的数据
    • 自己修改的数据
  • 看不到:
    • 其他未提交事务的修改
    • 自己开始后其他事务提交的修改(RR 级别)

✅ 结果:同一个事务内多次读,结果一致(可重复读)


2. 写一致性(当前读)

UPDATE / DELETE / SELECT ... FOR UPDATE 是 当前读:

  • 读取最新已提交版本
  • 加锁,防止并发写冲突

✅ 结果:写操作基于“最新真实数据”,不会写丢


3. 版本链 + ReadView 保证“该看到什么”

判断规则简化版:

  • 如果版本的 trx_id < 当前事务 ID 且已提交 → 可见
  • 如果是自己事务修改 → 可见
  • 否则 → 沿 undo log 找上一个版本

✅ 每个事务都像在“自己的时间切片”里操作


4. 隔离级别与一致性关系

隔离级别 MVCC 行为
读未提交 基本不用 MVCC
读已提交(RC) 每次读生成新 ReadView
可重复读(RR) 事务开始生成一次 ReadView(MySQL 默认)
串行化 依赖锁,而非 MVCC

✅ MVCC 主要服务 RC 和 RR


四、一句话总结

MVCC 通过“数据多版本 + 事务快照(ReadView)+ undo log”,让每个事务看到一致的数据视图,从而在无锁读的情况下保证数据一致性。

如果你愿意,我也可以用**流程图 / 例子(两个事务同时改同一行)**来更直观地说明。

向AI问一下细节

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

AI
助
手