Database 什么是多版本并发控制(MVCC),谁支持它?

Database 什么是多版本并发控制(MVCC),谁支持它?,database,deadlock,terminology,Database,Deadlock,Terminology,最近,Jeff开始考虑与阅读相关的数据库死锁问题。声称可以解决这个问题。它是什么?哪些数据库支持它 更新:这些支持它(其他哪些?) 神谕 postgresql 以及在发出INSERT、UPDATE和DELETE语句时MVCC如何工作的功能图。很长一段时间以来(至少从Oracle 8.0开始),Oracle就有一个优秀的多版本控制系统 下面的内容应该会有所帮助 用户A启动一个事务,并在时间T1用某个值更新1000行 用户B在时间T2读取相同的1000行 用户A使用值Y(原始值X)更新第543行

最近,Jeff开始考虑与阅读相关的数据库死锁问题。声称可以解决这个问题。它是什么?哪些数据库支持它

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

  • 神谕
  • postgresql


以及在发出INSERT、UPDATE和DELETE语句时MVCC如何工作的功能图。

很长一段时间以来(至少从Oracle 8.0开始),Oracle就有一个优秀的多版本控制系统

下面的内容应该会有所帮助

  • 用户A启动一个事务,并在时间T1用某个值更新1000行
  • 用户B在时间T2读取相同的1000行
  • 用户A使用值Y(原始值X)更新第543行
  • 用户B到达第543行,发现事务自时间T1开始运行
  • 数据库从日志中返回未修改的记录。返回值是在小于或等于T2的时间提交的值
  • 如果无法从重做日志中检索记录,则表示数据库设置不正确。需要为日志分配更多的空间
  • 这样就实现了读取一致性。返回的结果对于事务的开始时间总是相同的。因此,在事务中可以实现读取一致性
  • 我试图用尽可能简单的术语解释……数据库中的多版本控制有很多方面。

    这里是一个例子。选择报价(我的重点):

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


    这就是为什么杰夫对自己的僵局如此困惑。读不应该导致这些错误。

    SQLServer2005和更高版本提供MVCC作为选项;然而,这不是默认值。如果内存可用,MS称之为快照隔离。

    MVCC也可以手动实现,方法是向表中添加一个版本号列,并始终执行插入而不是更新

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


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

    MySQL在默认情况下也使用MVCC,如果您使用InnoDB表:
    Firebird做到了这一点,他们称之为MGA(多代架构)

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


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

    以下是MVCC的实现:

    SQL Server 2005(非默认,
    上设置读取提交的快照)

    Oracle(自第8版起)

    MySQL 5(仅适用于InnoDB表)

    PostgreSQL

    火鸟

    Informix


    我非常肯定Sybase和IBM DB2 Mainframe/LUW没有MVCC的实现,DB2 9.7版中有许可版本的postgress plus。这意味着此功能(在正确模式下)支持此功能

    McObject于2009年11月宣布,它已将可选的MVCC事务管理器添加到其eXtremeDB嵌入式数据库中:


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

    本文对MVCC进行了很好的解释,并给出了一些eXtremeDB的性能数据,McObject联合创始人兼首席执行官在RTC杂志上撰文:

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

    dbX支持MVCC

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

    还支持MVCC

    在MySQL中使用时,MySQL也支持MVCC

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

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

    From

    卧铺, OrientDB, CouchDB, PostgreSQL, 伏地魔计划, BigTable, Percona服务器, HyperGraphDB, 下蒙蒙细雨 克劳丹特, IBM DB2, 系统间Caché, InterBase也使用MVCC。
    SAP HANA是一个全内存计算系统,因此select的MVCC成本非常低…:)

    +1自Oracle 8.0之前的方式-我相信自Oracle 4.0以来。读取一致性和重复读取之间是否相同?
    数据库从日志返回未修改的记录[…]如果无法从重做日志中检索记录,您的意思是从撤消段。重做日志用于崩溃后的数据库恢复以及复制。它们有助于实现ACID的A和D,并被设计为线性,仅写。读取一致性,即ACID的I,由undo段提供。您可以添加该语句的链接。Interbase也是如此,但我认为在有firebird的情况下使用它没有任何意义。Firebird是Interbase…:)Firebird是Interbase,他们现在和将来都会有分歧。我们无法获得原始的Jim Starkey的白皮书,但后面有一些摘要:也有。