47

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

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

  • 甲骨文
  • PostgreSQL
4

15 回答 15

41

Oracle 长期以来一直拥有出色的多版本控制系统(至少从 oracle 8.0 开始)

以下应该会有所帮助。

  1. 用户 A 启动事务并在 T1 时间用某个值更新 1000 行
  2. 用户 B 在时间 T2 读取了相同的 1000 行。
  3. 用户 A 用值 Y(原始值 X)更新第 543 行
  4. 用户 B 到达第 543 行,发现事务从时间 T1 开始在运行。
  5. 数据库从日志中返回未修改的记录。返回值是在小于或等于 T2 的时间提交的值。
  6. 如果无法从重做日志中检索到记录,则意味着数据库设置不正确。需要为日志分配更多空间。
  7. 这样就实现了读取一致性。返回的结果相对于事务的开始时间总是相同的。因此在事务中实现了读取一致性。

我试图用最简单的术语来解释......数据库中的多版本化有很多。

于 2008-08-26T08:04:44.073 回答
10

PostgreSQL的多版本并发控制

以及这篇文章,其中包含 MVCC 在发出 INSERT、UPDATE 和 DELETE 语句时如何工作的图表。

于 2008-08-26T07:15:58.493 回答
9

下面有一个 MVCC 的实现:

SQL Server 2005(非默认,SET READ_COMMITTED_SNAPSHOT ON

甲骨文(自版本 8 起)

MySQL 5(仅适用于 InnoDB 表)

PostgreSQL

火鸟

Informix

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

于 2009-06-04T17:53:34.110 回答
3

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

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

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

于 2008-10-29T06:12:52.723 回答
3

XtremeData dbX 支持 MVCC。

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

于 2010-11-15T17:49:31.693 回答
2

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

于 2012-09-12T08:15:50.867 回答
1

这是MVCC 上的 PostgreSQL 文档页面的链接。选择报价(强调我的):

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

这就是杰夫对他的僵局如此困惑的原因。读取永远不会导致它们。

于 2008-08-26T11:31:37.257 回答
1

SQL Server 2005 及更高版本提供 MVCC 作为选项;但是,这不是默认设置。如果有记忆的话,MS 称之为快照隔离。

于 2008-08-26T21:56:36.367 回答
1

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

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

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

于 2008-08-26T22:00:06.793 回答
1

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

于 2008-10-29T03:52:10.980 回答
1

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

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

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

于 2010-07-31T02:55:31.060 回答
1

这篇由 McObject 的联合创始人兼首席执行官在 RTC 杂志上撰写的文章中对 MVCC 进行了很好的解释(带有图表)和一些 eXtremeDB 的性能数据:

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

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

于 2010-07-31T03:01:04.640 回答
0

DB2 9.7 版中包含 postgress plus 的许可版本。这意味着此功能(在正确的模式下)支持此功能。

于 2010-05-20T11:40:18.627 回答
0

Berkeley DB也支持 MVCC。

并且在 MySQL 中使用BDB 存储引擎时,MySQL 也支持 MVCC。

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

另一个包含 MVCC 的面向文档的 DBMS 是CouchDB。这里的 MVCC 也是内置对等复制的一大优势。

于 2011-04-25T12:35:12.763 回答
0

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

Couchbase、OrientDB、CouchDB、PostgreSQL、伏地魔项目、BigTable、Percona 服务器、HyperGraphDB、Drizzle、Cloudant、IBM DB2、InterSystems Caché、InterBase

于 2012-02-23T21:03:56.337 回答