Skip to main content
 首页 » 数据库

通过例子看懂MVCC(Multi Version Concurrency Control)

2022年07月19日132jillzhang

本文简要介绍MVCC并解释其工作原理。也许你已看到很多相关的理论知识,这里希望使用最容易理解的示例进行说明。

1. 什么是MVCC(Multi Version Concurrency Control)

简言之,一条记录有多个版本。

举例:
用户A插入一条ID为1的记录(存储该记录在数据页上)。
用户B更新ID为1的记录。

一条插入记录并被另一个用户更新。
首先插入记录,旧版本记录被新的更新语句改变,变成了新版本记录。但新版本记录在数据页上是独立新增,不是更新原来记录。
MVCC对每个变化存储不同的版本,而不是覆盖处理,但其存储所有记录的差异版本。

举例:
你在笔记上写下句子:“我是优秀的数据库开发人员”。
现在修改该句子:“我是优秀的数据库管理员”。

其他数据库做的事情与现实生活的示例一样。但MVCC使用不同的版本存储这两个句子。

旧版:“我是优秀的数据库开发人员”。
新版:“我是优秀的数据库管理员”。

缺省情况下,仅能查询新版数据。这就是MVCC的简单定义及示例。

2. 为什么要使用MVCC(Multi Version Concurrency Control)

首先讨论并发,多个用户同时位不同目的访问数据库或记录。
MVCC提供对数据库的并发访问。

假设一个用户读记录,第二个用户尝试更新相同记录。现在读者想去读更新过程完成之前的记录,这时可以容许用户读未提交的或不一致的数据(没有被更新)。

另外,你能应用锁,所有访问者必须等等更新完成之后。

但锁和脏读都不是完美的解决方案,锁降低性能,脏读不一定是正确数据。

MVCC是最佳解决方案,访问者可以看到旧版本数据,一旦更新完成则能看到新提交版本数据。读写过程不会彼此阻塞。

访问者能读句子:“我是优秀的数据库开发人员”。更新之后能读新的版本:“我是优秀的数据库管理员”。

3. MVCC的缺点

MVCC的主要缺点是:需要更多的空间存储不同版本数据。当然后面可以使用特定的清理命令删除旧版数据,但针对更新或删除产生的旧数据碎片需要更多的维护工作。在MVCC中,相同数据会导致更新冲突,因为两个不同的事务可以更新该行的相同版本。

4. 总结

本文简要通过实例介绍了MVCC架构。目前使用MVCC架构的数据库有:ORACLE、PostgreSQL、MySQL (仅 InnoDB 引擎),Microsoft SQL Server也可以通过“快照隔离级别”实现。


本文参考链接:https://blog.csdn.net/neweastsun/article/details/112036494
阅读延展