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

时间:2008-08-26 07:04:22

标签: database deadlock glossary

最近Jeff有posted关于他与阅读相关的数据库死锁问题。 Multiversion Concurrency Control (MVCC)声称要解决这个问题。它是什么,以及哪些数据库支持它?

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

  • 预言
  • postgresql

15 个答案:

答案 0 :(得分:36)

Oracle已经有很好的多版本控制系统,因为很长时间(至少从oracle 8.0开始)

以下应该有帮助。

  1. 用户A启动一个事务,并在时间T1
  2. 更新一些值为1000的行
  3. 用户B在时间T2读取相同的1000行。
  4. 用户A更新行543,其值为Y(原始值X)
  5. 用户B到达第543行并发现自时间T1以来交易正在运行。
  6. 数据库从日志中返回未修改的记录。返回值是在小于或等于T2时提交的值。
  7. 如果无法从重做日志中检索记录,则表示数据库设置不正确。需要为日志分配更多空间。
  8. 这样就实现了阅读的一致性。返回的结果总是与事务的开始时间相同。因此,在事务中,实现了读取一致性。
  9. 我试图用最简单的术语解释......在数据库中有很多可以进行多版本化。

答案 1 :(得分:9)

PostgreSQL's Multi-Version Concurrency Control

以及this article以及发出INSERT,UPDATE和DELETE语句时MVCC如何工作的图表。

答案 2 :(得分:9)

以下是MVCC的实施:

SQL Server 2005(非默认,SET READ_COMMITTED_SNAPSHOT ON

Oracle(自版本8开始)

MySQL 5(仅限InnoDB表)

的PostgreSQL

火鸟

的Informix

我非常确定Sybase和IBM DB2 Mainframe / LUW没有MVCC的实现

答案 3 :(得分:3)

XtremeData dbX支持MVCC。

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

答案 4 :(得分:2)

Firebird做到了,他们称之为MGA(多代建筑)。

他们保持原始版本不变,并添加一个新版本,只有使用它的会话才能看到,当提交时,旧版本被禁用,并且为每个人启用了更新的版本(文件堆积了数据和需求)定期清理)。

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

答案 5 :(得分:2)

SAP HANA也使用MVCC。 SAP HANA是一个完整的内存计算系统,因此选择的MVCC成本非常低......:)

答案 6 :(得分:1)

这是link to the PostgreSQL doc page on MVCC。选择引用(强调我的):

  

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

这就是为什么杰夫对他的僵局感到困惑。读取永远不应该导致它们。

答案 7 :(得分:1)

SQL Server 2005及以上提供MVCC作为选项;但它不是默认值。如果内存服务,MS称其为快照隔离。

答案 8 :(得分:1)

MVCC也可以手动实现,方法是在表中添加版本号列,并始终执行插入而不是更新。

这是一个更大的数据库,并且选择速度较慢,因为每个数据库需要一个子查询来查找最新记录。

对于需要对所有更改进行100%审核的系统而言,这是一个出色的解决方案。

答案 9 :(得分:1)

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

答案 10 :(得分:1)

McObject在11/09宣布它已在其eXtremeDB嵌入式数据库中添加了一个可选的MVCC事务管理器:

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

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

答案 11 :(得分:1)

有一个很好的解释MVCC - 图表 - 以及本文中的一些性能数字,由McObject的联合创始人兼首席执行官在RTC杂志撰写:

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

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

答案 12 :(得分:0)

DB2版本9.7具有postgres plus的许可版本。这意味着此功能(在右侧模式下)支持此功能。

答案 13 :(得分:0)

Berkeley DB也支持MVCC。

当在MySQL中使用BDB storage engine时,MySQL也支持MVCC。

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

面向DBCC的另一个面向MVCC的文档将是CouchDB。对于内置的点对点复制,MVCC也是一个很大的优势。

答案 14 :(得分:0)

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

Couchbase, OrientDB, CouchDB的, PostgreSQL的, 伏地魔项目, BigTable的, Percona服务器, HyperGraphDB, 毛毛雨, Cloudant, IBM DB2, InterSystemsCaché, IB的