最近,Jeff发布了关于他与阅读相关的数据库死锁问题的帖子。 多版本并发控制(MVCC)声称可以解决这个问题。它是什么,哪些数据库支持它?
更新:这些支持它(其他哪些?)
- 甲骨文
- PostgreSQL
最近,Jeff发布了关于他与阅读相关的数据库死锁问题的帖子。 多版本并发控制(MVCC)声称可以解决这个问题。它是什么,哪些数据库支持它?
更新:这些支持它(其他哪些?)
Oracle 长期以来一直拥有出色的多版本控制系统(至少从 oracle 8.0 开始)
以下应该会有所帮助。
我试图用最简单的术语来解释......数据库中的多版本化有很多。
以及这篇文章,其中包含 MVCC 在发出 INSERT、UPDATE 和 DELETE 语句时如何工作的图表。
下面有一个 MVCC 的实现:
SQL Server 2005(非默认,SET READ_COMMITTED_SNAPSHOT ON
)
甲骨文(自版本 8 起)
MySQL 5(仅适用于 InnoDB 表)
PostgreSQL
火鸟
Informix
我很确定 Sybase 和 IBM DB2 Mainframe/LUW 没有 MVCC 的实现
Firebird 做到了,他们称之为 MGA(多代架构)。
他们保持原始版本不变,并添加一个只有使用它的会话才能看到的新版本,提交时禁用旧版本,并为所有人启用新版本(文件堆积数据并需要定期清理) .
Oracle 覆盖数据本身,并为其他会话和回滚使用回滚段/撤消表空间。
XtremeData dbX 支持 MVCC。
此外,dbX 可以利用在 FPGA 硬件中实现的 SQL 原语。
SAP HANA 也使用 MVCC。SAP HANA 是一个完整的内存计算系统,因此选择的 MVCC 成本非常低...... :)
这是MVCC 上的 PostgreSQL 文档页面的链接。选择报价(强调我的):
使用 MVCC 并发控制模型而不是锁定的主要优点是,在 MVCC 中,为查询(读取)数据而获得的锁与为写入数据而获得的锁不会冲突,因此读取永远不会阻塞写入,写入永远不会阻塞读取。
这就是杰夫对他的僵局如此困惑的原因。读取永远不会导致它们。
SQL Server 2005 及更高版本提供 MVCC 作为选项;但是,这不是默认设置。如果有记忆的话,MS 称之为快照隔离。
MVCC 也可以手动实现,通过在表中添加版本号列,并始终执行插入而不是更新。
这样做的代价是一个更大的数据库,并且选择速度较慢,因为每个人都需要一个子查询来查找最新记录。
对于需要对所有更改进行 100% 审核的系统来说,这是一个出色的解决方案。
如果您使用 InnoDB 表,MySQL 默认也使用 MVCC:http: //dev.mysql.com/doc/refman/5.0/en/innodb-multi-versioning.html
McObject 在 11/09 宣布它已在其 eXtremeDB 嵌入式数据库中添加了一个可选的 MVCC 事务管理器:
http://www.mcobject.com/november9/2009
eXtremeDB 最初是作为内存数据库系统 (IMDS) 开发的,现在提供具有混合(内存/磁盘)存储、高可用性、64 位支持等的版本。
这篇由 McObject 的联合创始人兼首席执行官在 RTC 杂志上撰写的文章中对 MVCC 进行了很好的解释(带有图表)和一些 eXtremeDB 的性能数据:
http://www.rtcmagazine.com/articles/view/101612
显然,随着应用程序扩展到包括在多个 CPU 内核上执行的许多任务,MVCC 越来越有益。
DB2 9.7 版中包含 postgress plus 的许可版本。这意味着此功能(在正确的模式下)支持此功能。
Berkeley DB也支持 MVCC。
并且在 MySQL 中使用BDB 存储引擎时,MySQL 也支持 MVCC。
Berkeley DB 是一个非常强大、可定制的完全符合 ACID 的 DBMS。它支持几种不同的索引方法,主从复制,可以用作具有自己的动态 API 的纯键值存储,也可以根据需要使用 SQL 查询。值得一看。
另一个包含 MVCC 的面向文档的 DBMS 是CouchDB。这里的 MVCC 也是内置对等复制的一大优势。
来自http://vschart.com/list/multiversion-concurrency-control/
Couchbase、OrientDB、CouchDB、PostgreSQL、伏地魔项目、BigTable、Percona 服务器、HyperGraphDB、Drizzle、Cloudant、IBM DB2、InterSystems Caché、InterBase