温馨提示×

温馨提示×

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

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

MVCC在读提交中怎么用

发布时间:2026-09-09 21:21:00 来源:亿速云 阅读:87 作者:小樊 栏目:数据库

MVCC(Multi-Version Concurrency Control,多版本并发控制)是数据库实现并发控制的重要机制,“读提交(Read Committed,RC)” 是常见的事务隔离级别之一。下面我用原理 + 例子 + 常见数据库实现来说明:MVCC 在“读提交”中是怎么用的。


一、先明确:读提交(Read Committed)是什么?

  • 一个事务只能看到已经提交(Committed)的数据
  • 同一个事务中:
    • 每次 SELECT 都会重新判断“哪些版本对我可见”
  • 可能出现:不可重复读(同事务两次读结果不同)

二、MVCC 的核心思想(通用)

数据库不为读加锁,而是:

  • 每行数据有多个版本
  • 每个版本带“事务ID / 时间戳”
  • 读操作根据**当前事务的“可见性规则”**选择合适的版本

三、MVCC 在「读提交」中的关键规则

Read Committed 下:

每次执行 SELECT 时,都使用“最新的已提交快照”

也就是说:

  • 不是事务开始时建快照
  • 而是每条 SQL 执行时建快照

四、直观例子(以事务ID为例)

初始数据

id=1, value=100, 创建事务=10

事务 A(RC)

BEGIN;
-- 第一次读
SELECT value FROM t WHERE id=1;
-- 看到 100

事务 B

BEGIN;
UPDATE t SET value=200 WHERE id=1;
-- 未提交

事务 A 再读

SELECT value FROM t WHERE id=1;
-- 仍看到 100(B未提交)

事务 B 提交

COMMIT;

事务 A 再读

SELECT value FROM t WHERE id=1;
-- 看到 200(新提交版本可见)

✅ 这就是 MVCC + 读提交 的效果


五、MVCC 怎么判断“版本是否可见”(简化版)

对一次 SELECT:

  1. 找到最新已提交版本
  2. 判断该版本的事务:
    • 是否已提交 ✅
    • 是否在“当前语句开始时”已提交 ✅
  3. 否则往前找旧版本

在 RC 中:

  • “当前语句开始” = 本次 SELECT 开始
  • 不是事务开始

六、不同数据库中的实现差异

1️⃣ PostgreSQL(典型 MVCC)

  • 每行有 xmin / xmax
  • RC 下:
    • 每条 SQL 获取一个 Snapshot
  • 完全无锁读

2️⃣ MySQL InnoDB

  • 使用 ReadView
  • RC 下:
    • 每次 SELECT 都生成新的 ReadView
  • 对比 RR(可重复读):
    • RR:事务开始建一次 ReadView
    • RC:每条语句建 ReadView

七、MVCC 在 RC 下的优缺点

✅ 优点

  • 读不阻塞写
  • 写不阻塞读
  • 并发性能高

❌ 缺点

  • 不可重复读
  • 同事务多次读可能不一致

八、一句话总结

在读提交隔离级别下,MVCC 通过“每条 SQL 使用最新已提交快照”来实现非锁定读,保证只能看到已提交数据,但允许不可重复读。

如果你愿意,我也可以:

  • MySQL / PostgreSQL 源码级规则
  • 对比 RC vs RR 的 MVCC 差异
  • 画一张 版本链 + ReadView 示意图
向AI问一下细节

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

AI