数据库:什么是多版本并发控制 (MVCC) 以及谁支持它?[关闭]
题
解决方案
Oracle 很早就拥有了一个优秀的多版本控制系统(至少从 Oracle 8.0 开始)
以下应该有所帮助。
- 用户 A 启动事务并在时间 T1 更新 1000 行的某个值
- 用户 B 在时间 T2 读取相同的 1000 行。
- 用户 A 使用值 Y(原始值 X)更新第 543 行
- 用户 B 到达第 543 行并发现事务自时间 T1 以来正在运行。
- 数据库从日志中返回未修改的记录。返回的值是在小于或等于 T2 的时间提交的值。
- 如果无法从重做日志中检索记录,则意味着数据库设置不正确。需要为日志分配更多空间。
- 这样就达到了读的一致性。对于事务的开始时间,返回的结果始终相同。因此在事务内实现了读取一致性。
我试图用最简单的术语来解释……数据库中的多版本化有很多内容。
其他提示
以下是MVCC的实现:
SQL Server 2005(非默认, SET READ_COMMITTED_SNAPSHOT ON
)
Oracle(自版本 8 起)
MySQL 5(仅适用于 InnoDB 表)
PostgreSQL
火鸟
信息系统
我很确定 Sybase 和 IBM DB2 Mainframe/LUW 没有 MVCC 的实现
也 本文 其中包含有关 MVCC 在发出 INSERT、UPDATE 和 DELETE 语句时如何工作的图表。
极限数据 dbX 支持 MVCC。
此外,dbX 可以利用在 FPGA 硬件中实现的 SQL 原语。
Firebird 做到了,他们称之为 MGA(多代架构)。
他们保持原始版本不变,并添加一个只有使用它的会话才能看到的新版本,提交时旧版本被禁用,而新版本对每个人都启用(文件堆积了数据,需要定期清理) 。
Oracle 会覆盖数据本身,并使用回滚段/撤消表空间用于其他会话并进行回滚。
SAP HANA 也使用 MVCC。SAP HANA 是一个完整的内存计算系统,因此 select 的 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 的许可版本。这意味着该功能(在正确的模式下)支持该功能。
从 http://vschart.com/list/multiversion-concurrency-control/
Couchbase,OrientDB,CouchDB,PostgreSQL,Project Voldemort,Bigtable,Percona Server,HyperGraphDB,Drizzle,Cloudant,IBM DB2,IntersystemsCaché,InterBase,InterBase