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

更新:这些支持它(还有哪些?)

  • 甲骨文
  • PostgreSQL
有帮助吗?

解决方案

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. 这样就达到了读的一致性。对于事务的开始时间,返回的结果始终相同。因此在事务内实现了读取一致性。

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

其他提示

以下是MVCC的实现:

SQL Server 2005(非默认, SET READ_COMMITTED_SNAPSHOT ON)

Oracle(自版本 8 起)

MySQL 5(仅适用于 InnoDB 表)

PostgreSQL

火鸟

信息系统

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

PostgreSQL的多版本并发控制

本文 其中包含有关 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 的许可版本。这意味着该功能(在正确的模式下)支持该功能。

伯克利数据库 还支持MVCC。

什么时候 BDB存储引擎 用在MySQL中,MySQL也支持MVCC。

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

另一种采用 MVCC 的面向文档的 DBMS 是 沙发数据库. 。MVCC 对于内置的点对点复制来说也是一大优势。

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

Couchbase,OrientDB,CouchDB,PostgreSQL,Project Voldemort,Bigtable,Percona Server,HyperGraphDB,Drizzle,Cloudant,IBM DB2,IntersystemsCaché,InterBase,InterBase

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top