最近Jeff有posted关于他与阅读相关的数据库死锁问题。 Multiversion Concurrency Control (MVCC)声称要解决这个问题。它是什么,以及哪些数据库支持它?
更新:这些支持它(其他人?)
答案 0 :(得分:36)
Oracle已经有很好的多版本控制系统,因为很长时间(至少从oracle 8.0开始)
以下应该有帮助。
我试图用最简单的术语解释......在数据库中有很多可以进行多版本化。
答案 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)
答案 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的