MVCC(Multi-Version Concurrency Control,多版本并发控制)之所以能实现**“不加锁的读”**,核心原因在于:读操作访问的是数据的历史版本,而不是当前正在被修改的数据,因此不需要阻塞写,也不需要与写操作争抢锁。
下面分层说明。
在纯锁机制下:
问题:
MVCC 的核心:
数据不是“被覆盖修改”,而是“保留多个版本”
典型做法:
➡ 没有资源冲突
➡ 不需要锁来保护“当前行”
例如 InnoDB:
ReadView满足可见性 → 直接读
不满足 → 沿 undo log 找上一个版本
➡ 控制并发的是逻辑规则,不是锁
所以:
MVCC 读 = 无锁读(Lock-Free Read)
不是,要分清楚:
SELECT(快照读)UPDATE / DELETESELECT ... FOR UPDATE)MVCC 通过多版本 + 快照可见性,让读操作访问历史数据,从而避免与写操作冲突,因此读不需要加锁。
如果你愿意,我也可以结合 InnoDB 的 undo log + ReadView 或 PostgreSQL 的 xmin/xmax 给你画一个具体例子。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。