最近杰夫发布了关于他阅读相关数据库死锁的问题. 多版本并发控制(MVCC)声称可以解决这个问题.它是什么,以及哪些数据库支持它?
更新:这些支持它(其他人?)
神谕
PostgreSQL的
Krantz.. 36
Oracle已经有很好的多版本控制系统,因为很长时间(至少从oracle 8.0开始)
以下应该有所帮助
用户A启动一个事务,并在时间T1更新1000行,并带有一些值
用户B在时间T2读取相同的1000行.
用户A更新行543,其值为Y(原始值X)
用户B到达行543并且发现自时间T1以来事务处于操作中.
数据库从日志中返回未修改的记录.返回值是在小于或等于T2时提交的值.
如果无法从重做日志中检索记录,则表示数据库未正确设置.需要为日志分配更多空间.
这样就实现了阅读的一致性.返回的结果总是与事务的开始时间相同.因此,在事务中,实现了读取一致性.
我试图用最简单的术语来解释......在数据库中有很多多版本.
Oracle已经有很好的多版本控制系统,因为很长时间(至少从oracle 8.0开始)
以下应该有所帮助
用户A启动一个事务,并在时间T1更新1000行,并带有一些值
用户B在时间T2读取相同的1000行.
用户A更新行543,其值为Y(原始值X)
用户B到达行543并且发现自时间T1以来事务处于操作中.
数据库从日志中返回未修改的记录.返回值是在小于或等于T2时提交的值.
如果无法从重做日志中检索记录,则表示数据库未正确设置.需要为日志分配更多空间.
这样就实现了阅读的一致性.返回的结果总是与事务的开始时间相同.因此,在事务中,实现了读取一致性.
我试图用最简单的术语来解释......在数据库中有很多多版本.
PostgreSQL的多版本并发控制
除了本文为特色的MVCC发出INSERT,UPDATE时,和DELETE语句的工作原理图.
以下是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的实现