多版本并发控制

多版本并发控制(Multiversion concurrency control， MCC 或 MVCC)，是数据库管理系统常用的一种并发控制，也用于程序设计语言实现事务内存。

MVCC意图解决读写锁造成的多个、长时间的读操作饿死写操作问题。每个事务读到的数据项都是一个历史快照，并依赖于实现的隔离级别。写操作不覆盖已有数据项，而是创建一个新的版本，直至所在操作提交时才变为可见。快照隔离使得事务看到它启动时的数据状态。

算法
MVCC使用时间戳 (TS), 或“自动增量的事务ID”实现“事务一致性”。MVCC可以确保每个事务(T)通常不必“读等待”数据库对象(P)。这通过对象有多个版本，每个版本有创建时间戳 与废止时间戳 (WTS)做到的。

事务Ti读取对象(P)时，只有比事务Ti的时间戳早，但是时间上最接近事务Ti的对象版本可见，且该版本应该没有被废止。 

事务Ti写入对象P时，如果还有事务Tk要写入同一对象，则(Ti)必须早于(Tk)，即 (Ti) < (Tk)，才能成功。

MVCC可以实现。

历史

MVCC在1981年的一篇论文"Concurrency Control in Distributed Database Systems"被充分论述，并成为经典描述。一般认为原创工作始于1978年的博士学位论文。

数据库实现
现在，多数数据库系统已经使用MVCC。
 Altibase
 ArangoDB
 Berkeley DB
 Cloudant
 Clustrix
 Couchbase
 CouchDB
 CUBRID
 IBM Db2 – 从 IBM DB2 9.7 LUW ("Cobra") 在 CS孤立级– currently committed mode
 IBM Cognos TM1 – 从版本9.5.2
 Drizzle
 Druid
 etcd
 EXASOL
 eXtremeDB
 Firebird
 FLAIM
 FoundationDB
 GE Smallworld Version Managed Data Store
 H2 Database Engine –从版本 1.0.57 (2007-08-25)
 HBase
 HSQLDB – 从版本 2.0
 IBM Netezza
 InfiniDB
 Ingres
 InterBase – 所有版本
 LMDB
 MariaDB (MySQL fork) – 当用于 XtraDB, InnoDB分支 or PBXT
 MarkLogic Server – 见
 MemSQL
 Meronymy SPARQL Database Server
 Microsoft SQL Server –当使用 READ_COMMITTED_SNAPSHOT, 从SQL Server 2005
 MongoDB – 当使用 WiredTiger存储引擎
 MySQL – 使用 InnoDB, Falcon, 或 Archive 存储引擎
 NuoDB
 ObjectDB
 ObjectStore
 Oracle database – 从 Oracle 4
 Oracle (née DEC) Rdb
 OrientDB
 PostgreSQL更新的事务如果删除、修改了数据项并提交，则老的事务将对这些提交结果可见。
 Postgres-XL
 Rdb/ELN
 RDM Embedded
 REAL Server
 Realm
 RethinkDB
 SAP HANA
 SAP IQ
 sones GraphDB
 Splice Machine
 Sybase SQL Anywhere
 Tibero –从 Tibero 3
 TokuMX
 Actian Vector
 Zope Object Database

参考文献

延伸阅读 
 Gerhard Weikum, Gottfried Vossen, Transactional information systems: theory, algorithms, and the practice of concurrency control and recovery, Morgan Kaufmann, 2002, 
 
并发控制
数据库