数据库:什么是多版本并发控制(MVCC)?谁支持它?
最近,Jeff发布了有关与读取相关的数据库死锁的麻烦。多版本并发控制(MVCC)声称可以解决此问题。它是什么,什么数据库支持它?
更新:这些都支持它(还有哪些?)
- 甲骨文
- PostgreSQL的
解决方案
回答
PostgreSQL的多版本并发控制
以及本文的功能图,其中给出了在发出INSERT,UPDATE和DELETE语句时MVCC的工作原理。
回答
自从很长一段时间以来(至少从oracle 8.0起),Oracle就已经拥有了一个出色的多版本控制系统,该系统已经很成熟了。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
以下应该会有所帮助。
- 用户A开始事务,并在T1时刻以某个值更新1000行
- 用户B在时间T2读取相同的1000行。
- 用户A使用值Y(原始值X)更新行543
- 用户B到达行543,发现自时间T1开始有交易在进行。
- 数据库从日志中返回未修改的记录。返回的值是在小于或者等于T2时提交的值。
- 如果无法从重做日志中获取记录,则表示数据库未正确设置。需要为日志分配更多空间。
- 通过这种方式,可以实现读取的一致性。对于事务的开始时间,返回的结果始终相同。因此,在事务中可以实现读取一致性。
我试图用最简单的术语来解释...数据库中的多版本化有很多。
回答
这是MVCC上PostgreSQL文档页面的链接。选择报价(强调我的):
The main advantage to using the MVCC model of concurrency control rather than locking is that in MVCC locks acquired for querying (reading) data do not conflict with locks acquired for writing data, and so reading never blocks writing and writing never blocks reading.
这就是杰夫被僵局如此困惑的原因。读取永远不会导致它们。
回答
SQL Server 2005及更高版本提供了MVCC选项;但是,这不是默认值。如果有内存,MS将其称为快照隔离。
回答
MVCC也可以通过将版本号列添加到表中并始终执行插入操作而不是更新操作来手动实现。
这样做的代价是数据库要大得多,并且选择速度较慢,因为每个数据库都需要一个子查询来查找最新记录。
对于需要对所有更改进行100%审核的系统而言,这是一个极好的解决方案。
回答
如果我们使用InnoDB表,则默认情况下,MySQL还使用MVCC:
http://dev.mysql.com/doc/refman/5.0/en/innodb-multi-versioning.html
回答
Firebird做到了,他们称其为MGA(多代架构)。
他们会保持原始版本不变,并添加一个新版本,只有在使用该会话的会话中才能看到,提交后将禁用较旧版本,并且每个人都启用较新版本(文件会堆积数据并需要定期清除) 。
Oracle会覆盖数据本身,并对其他会话和回滚使用回滚段/撤消表空间。
回答
以下是MVCC的实现:
SQL Server 2005(非预设,SET READ_COMMITTED_SNAPSHOT ON
)
- http://msdn.microsoft.com/en-us/library/ms345124.aspx
Oracle(版本8起)
MySQL 5(仅适用于InnoDB表)
PostgreSQL的
火鸟
Informix
我很确定Sybase和IBM DB2 Mainframe / LUW没有MVCC的实现
回答
DB2 9.7版具有postgress plus的许可版本。这意味着此功能(在正确的模式下)支持此功能。
回答
McObject在11/09中宣布,已在其eXtremeDB嵌入式数据库中添加了一个可选的MVCC事务管理器:
http://www.mcobject.com/november9/2009
eXtremeDB最初是作为内存数据库系统(IMDS)开发的,现已提供具有混合(内存/磁盘)存储,高可用性,64位支持等功能的版本。
回答
由McObject的联合创始人兼首席执行官在RTC Magazine上撰写的这篇文章中,对MVCC有一个很好的解释-带有图表-以及一些eXtremeDB的性能数字:
http://www.rtcmagazine.com/articles/view/101612
显然,随着应用程序扩展到包括在多个CPU内核上执行的许多任务,MVCC越来越受益。
回答
XtremeData dbX支持MVCC。
另外,dbX可以利用在FPGA硬件中实现的SQL原语。