数据库:什么是多版本并发控制(MVCC),谁支持它?

Jeff最近发布了关于数据库与阅读相关的死锁问题。 多版本并发控制(MVCC)声称解决这个问题。 这是什么,什么数据库支持它?

更新:这些支持(其他人?)

  • 神谕
  • PostgreSQL的

Oracle已经有了很好的多版本控制系统(至less从oracle 8.0开始)

以下应该有所帮助

  1. 用户A开始一个事务并且在T1时刻用一些值更新1000行
  2. 用户B在时间T2读取相同的1000行。
  3. 用户A用值Y(原始值X)更新行543
  4. 用户B到达行543并且从时间T1开始发现事务处于操作中。
  5. 数据库从日志中返回未修改的logging。 返回的值是在小于或等于T2时提交的值。
  6. 如果logging不能从重做日志中检索到,则意味着数据库没有正确设置。 需要有更多的空间分配给日志。
  7. 通过这种方式可以实现阅读整合。 返回的结果始终与交易的开始时间相同。 所以在一个事务中读取一致性是可以实现的。

我试图用最简单的方式来解释…数据库中的多重处理有很多。

PostgreSQL的多版本并发控制

以及这篇文章 ,其特点是发行iNSERT,UPDATE和DELETE语句时mvCC如何工作的图表。

下面有一个MVCC的实现:

SQL Server 2005(非默认, SET READ_COMMITTED_SNAPSHOT ON

Oracle(从版本8开始)

MySQL 5(仅适用于InnoDB表)

PostgreSQL的

火鸟

Informix的

我很确定Sybase和IBM DB2 Mainframe / LUW没有实现MVCC

火鸟这样做,他们称之为MGA(多代build筑)。

他们保持原始版本不变,并添加一个新的版本,只有会话使用它可以看到,当提交旧版本被禁用,并为每个人启用较新的版本(文件堆积与数据,需要定期清理) 。

Oracle会覆盖数据本身,并为其他会话使用回滚段/撤消表空间并回滚。

XtremeData dbX支持MVCC。

另外,dbX可以使用在FPGA硬件中实现的SQL原语。

SAP HANA也使用MVCC。 SAP HANA是一个完整的内存计算系统,所以select的MVCC成本非常低… 🙂

这是一个链接到MVCC上的PostgreSQL文档页面 。 select报价(重点是我的):

使用并发控制而不是locking的MVCC模型的主要优点是,在MVCC中,为查询(读取)数据而获取的锁不会与用于写入数据的锁相冲突,因此读取永远不会阻止写入和写入永远不会阻止读取

这就是为什么杰夫被他的僵局所困惑。 阅读不应该导致他们。

SQL Server 2005和提供MVCC作为一个选项; 但是这不是默认的。 如果内存服务,MS称它为快照隔离。

MVCC也可以通过在表中添加一个版本号列来手动实现,并且总是进行插入而不是更新。

这是一个更大的数据库的成本,并select较慢,因为每一个需要一个子查询来find最新的logging。

对于需要对所有变更进行100%审计的系统,这是一个很好的解决scheme。

如果您使用InnoDB表,MySQL也默认使用MVCC: http : //dev.mysql.com/doc/refman/5.0/en/innodb-multi-versioning.html

McObject在11月9日宣布,它已经在其eXtremeDBembedded式数据库中增加了一个可选的MVCC事务pipe理器:

http://www.mcobject.com/november9/2009

eXtremeDB最初是作为内存数据库系统(IMDS)开发的,现在已经有了混合(内存/磁盘)存储,高可用性,64位支持等版本。

在RTC杂志上,McObject公司联合创始人兼首席执行官撰写的这篇文章中,对MVCC有很好的解释,包括图表和一些eXtremeDB的性能数据:

http://www.rtcmagazine.com/articles/view/101612

显然,随着应用程序扩展到包含在多个CPU内核上执行的许多任务,MVCC越来越有益处。

DB2 9.7版本中包含Postgress Plus的许可版本。 这意味着此function(在正确模式下)支持此function。

伯克利DB也支持MVCC。

而当MySQL使用BDB存储引擎时,MySQL也支持MVCC。

伯克利DB是一个非常强大的,可定制的完全符合ACID的DBMS。 它支持多种不同的索引方法,主从复制,可以用它自己的dynamicAPI作为纯键值存储,或者如果需要,可以用SQL查询。 值得一看。

另一个面向文档的DBMS拥抱MVCC将是CouchDB 。 这里的MVCC对于内置的对等复制来说也是一个很大的优势。

http://vschart.com/list/multiversion-concurrency-control/

Couchbase,OrientDB,CouchDB,PostgreSQL,Project Voldemort,BigTable,Percona Server,HyperGraphDB,Drizzle,Cloudant,IBM DB2,InterSystemsCaché,InterBase