MVCC 的核心思路不是把所有读写都锁住,而是让读取尽量去看一个自己应该看到的历史版本,从而减少读写冲突。
它为什么能少加锁
因为更新数据时,数据库不会只留下最新值,还会把旧版本通过版本链保留下来。普通查询不必总去抢当前正在修改的那一版。
读取时靠什么判断该看哪个版本
关键在一致性视图,也就是常说的 Read View。查询会根据事务可见性规则,从版本链里挑出当前事务应该看到的那一版数据。
它解决了什么问题
主要是缓和读写冲突。普通 select 不必动不动阻塞写入,写入也不必总把普通读取全部卡住,所以并发性能更好。
它不是万能替代锁
当你执行 update、delete 或 select ... for update 时,还是要配合当前读和锁机制。MVCC 重点解决的是快照读,不是把所有并发问题都消灭掉。
一句话理解
MVCC 让数据库在很多读场景下不用硬碰硬抢锁,而是通过多版本把“该你看到哪一版”这件事处理掉。
正文完




