温馨提示×

温馨提示×

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

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

当前读MVCC如何处理

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

你的问题比较简短,“当前读 MVCC 如何处理”通常出现在 MySQL / InnoDB 语境里。我按这个背景给你讲清楚。


一、先区分两个概念

1. 快照读(Snapshot Read)

  • 普通 SELECT
  • 利用 MVCC + ReadView
  • 读的是历史版本,不加锁
SELECT * FROM t WHERE id = 1;

2. 当前读(Current Read)

当前读 = 读取最新已提交版本 + 加锁

以下语句都是当前读:

  • SELECT ... FOR UPDATE
  • SELECT ... LOCK IN SHARE MODE
  • INSERT
  • UPDATE
  • DELETE
SELECT * FROM t WHERE id = 1 FOR UPDATE;
UPDATE t SET name='a' WHERE id=1;

二、当前读和 MVCC 的关系

关键点:

当前读 不走 MVCC 的历史版本,而是直接读取 最新版本(聚簇索引中的当前数据)

MVCC 主要服务的是 快照读,而当前读依赖 锁 + 最新数据。


三、当前读的具体处理流程(InnoDB)

以 UPDATE 为例:

1. 定位最新记录

  • 通过索引找到 当前最新版本的行
  • 不管 MVCC 里有没有旧版本

2. 加锁

  • 对命中行加 行锁(Record Lock)
  • 若存在间隙问题,加 Gap Lock / Next-Key Lock

3. 检查可见性(仍用事务ID)

  • 虽然读最新,但仍然要判断:
    • 当前事务是否能看到这行(避免脏写)
  • 如果其他事务未提交,会 阻塞等待

4. 修改并写 Undo Log

  • 旧版本写入 Undo Log
  • 新版本写入 聚簇索引
  • 事务ID更新

四、MVCC 在当前读中的作用

MVCC 不直接决定“读哪个版本”,但:

  • Undo Log 由 MVCC 机制维护
  • 当前读修改时,依赖 Undo Log 做回滚
  • 锁等待和事务可见性依赖事务ID体系

一句话:

当前读不用 MVCC 读旧版本,但 MVCC 支撑了它的并发安全和回滚能力


五、举个例子

事务 A:

BEGIN;
UPDATE t SET v=2 WHERE id=1;

事务 B(当前读):

SELECT * FROM t WHERE id=1 FOR UPDATE;

→ 阻塞,等 A 提交或回滚

事务 C(快照读):

SELECT * FROM t WHERE id=1;

→ 可能读到旧值(MVCC)


六、总结一句话

当前读不使用 MVCC 的历史版本,而是读取最新数据并加锁;MVCC 主要服务于快照读,但为当前读提供回滚和并发控制基础。

如果你指的是 PostgreSQL / Oracle / 其他数据库,或者想看 源码级 / 锁类型细节,可以继续问。

向AI问一下细节

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

AI
助
手