你的问题比较简短,“当前读 MVCC 如何处理”通常出现在 MySQL / InnoDB 语境里。我按这个背景给你讲清楚。
SELECTSELECT * FROM t WHERE id = 1;
当前读 = 读取最新已提交版本 + 加锁
以下语句都是当前读:
SELECT ... FOR UPDATESELECT ... LOCK IN SHARE MODEINSERTUPDATEDELETESELECT * FROM t WHERE id = 1 FOR UPDATE;
UPDATE t SET name='a' WHERE id=1;
关键点:
当前读 不走 MVCC 的历史版本,而是直接读取 最新版本(聚簇索引中的当前数据)
MVCC 主要服务的是 快照读,而当前读依赖 锁 + 最新数据。
以 UPDATE 为例:
MVCC 不直接决定“读哪个版本”,但:
一句话:
当前读不用 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 / 其他数据库,或者想看 源码级 / 锁类型细节,可以继续问。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。