具有高效版本控制的数据库管理系统的制作方法

文档序号:6490609阅读:143来源:国知局
专利名称:具有高效版本控制的数据库管理系统的制作方法
技术领域
本发明涉及对可由多个用户并发访问的数据的管理。
背景技术
数据库是存储在计算机中的相关记录的集合。在本领域中,这种数据记录的集合也被称作信息数据库。数据记录也可称作数据元组,或者简称为元组。多个用户可以并发访问这些数据记录。事务被运行来代表数据库用户访问这些数据记录。事务可以从数据库读取、向数据库写,或者又读又写。因此,事务执行产生了对一组数据记录的读和写操作的集合。事务一般请求对它们要读或写的数据记录的访问许可。访问许可一般由锁(lock)实现。事务一般通过要求对应的锁来请求对数据记录的访问许可。访问许可冲突表现为锁冲突。在多个事务同时以不兼容模式试图访问相同的数据记录时可能导致锁冲突。
解决锁冲突的一种方法是让冲突的事务等待。例如,发出了对数据记录的冲突锁请求的事务被强制等待,直到已拥有相同数据记录上的锁的事务完成其执行为止(完成事务的意思是说该事务要么被提交要么被回滚)。然而,在这种情形中,两个或多个事务可能在死锁中僵持,在死锁中每个事务都等待另一个事务完成,结果任一个事务都不能取得任何进展。
已发明了多种技术来减少在事务系统中使用的锁的数量,例如,时间戳排序、确认和多版本方案。在这些方案中,多版本方案已在商业上取得了成功,并且许多供应商使用这些方案。在典型的多版本方案中,对数据记录的写操作创建该记录的新版本,而读操作从可读的版本中选择该记录的合适版本。在这种类型的数据库系统中,同时可能存在数据记录的多个版本。这些版本中的一些可能不会被任何当前执行的或将来的事务使用。这些不会被使用的版本被称作“垃圾”。因此,这些系统需要应用垃圾收集机制来回收由不被使用的版本占用的空间。许多多版本数据库方案部有惰性垃圾集合,其中数据记录的旧版本在数据库中存在超过必须的时间,并且垃圾可能在该数据库中存在无限长的时间。
并发执行多个事务要求在一定程度上保护给定的事务免受其他事务影响。这种保护一个事务免受其他事务影响的保护被称为它的“隔离”。例如,如果事务对数据记录执行写操作,则新的数据值不应当被任何其他事务读取,直到前一事务完成为止。ANSI已定义了各种隔离级别。一个示例就是公知的“可串行化(Serializable)”隔离级别,在这种级别中多个事务以执行调度等同于串行调度的方式执行,其中每个事务的所有操作都被成串(cluster),即,多个事务看起来一个接一个地被顺次执行。可串行化是最高程度的隔离。
独立于利用任何加锁机制实现的隔离,有些数据库操作需要数据记录在被该操作读取时是稳定的,即一旦被该操作访问,数据记录就不再改变直到该操作结束。这种要求一般被称作数据“快照”。用于执行数据库操作的常用语言是结构化查询语言(SQL)。有些SQL语句在它们执行期间可能需要不只一次引用满足谓词(predicate)的一个元组或一组元组。如果数据库管理系统(DBMS)保证每次对给定的谓词求值时SQL语句执行都将看到相同的数据值,则称该DBMS提供了“快照”隔离。
现有技术描述了使用二版本技术以及多版本技术的数据库系统,这些数据库系统满足在可串行化隔离下事务执行的上述要求。然而,这些方案也有若干缺点。例如,只读事务必须声明其是只读事务。这是不实际的,因为许多DBMS动态地创建SQL语句,并且不可能在每个事务每次执行开始时评估该事务是否是只读事务。其次,当前分析和少量产品的商业上成功表明虽然可串行化隔离是一种理论上令人感兴趣的概念,但是最可行的隔离还是ANSI SQL隔离READ COMMITTED(读已提交)或者其变体。
当前需要改进在允许并发处理的系统中的事务并发性和当前使用的访问控制和锁冲突解决方案之间的权衡,着眼于ANSI READ COMMITTED事务的高效实现。

发明内容
在内部每条数据记录由单个逻辑元组表示。逻辑元组或者直接指向单个物理元组,或者指向被称作“版本列表”的数据结构。物理元组也被称作“内容项”。逻辑元组可以通过版本列表与两个物理内容项相关联。由这两个物理内容项之一代表的数据记录中最近提交的值被称为“已提交内容项”。每个物理内容项存储数据值和一组控制标志(1)删除位;(2)分配位;(3)引用计数。
对数据记录的访问控制可由DBMS中的加锁组件维护。当事务要更新数据记录时,该事务通过对逻辑元组加X锁来获得对该数据记录的排他许可。然后,事务创建该数据记录的已提交物理内容项的新版本。这一新物理版本称作“未提交内容项”。
在静止状态中,所有逻辑元组指向它们各自的已提交物理内容项。对数据记录的写操作创建版本列表,并且使对应的逻辑元组指向该版本列表。对于给定的逻辑元组,版本列表维护至多两个物理内容项。版本列表具有两个字段用于这种目的(1)已提交物理内容项,也称作“读拷贝”,以及(2)未提交物理内容项,也称作“写拷贝”。已提交物理内容项是可由任何事务引用的当前读拷贝。版本列表中的(未决)未提交内容项字段引用物理未提交拷贝,该拷贝仅由执行了给定写操作的事务使用。当该“写”事务提交时,如果可能的话,前一读拷贝(老的已提交内容项)被重分配。在写事务提交后,逻辑元组指向新的已提交内容项,版本列表被重分配,并且逻辑元组上的X锁被释放。
读操作不具有对逻辑元组或其物理内容项的排他访问权限。读操作仅增加最近的已提交物理内容项的引用计数。当读操作完成时,其将与物理内容项相关联的引用计数递减。如前所述,在提交时,每个写事务将写拷贝(未提交内容项)切换到读拷贝(已提交内容项)。然后写事务检查老的已提交内容项(即,前一读拷贝)的引用计数。如果引用计数为零,则老的已提交物理内容项与描述该被删除内容项的所有日志记录一起被立即重分配。如果已提交物理内容项的引用计数为正,则写事务不重分配该物理内容项。然后,写事务执行也被称作“延迟删除”的伪删除。
写事务通过设置对应的老的已提交内容项的删除位来执行对数据记录的延迟删除。然后好像实际执行了删除一样将所有日志记录压入。然而,物理内容项的分配位被保持在这样的状态中,该状态防止老的已提交内容项被DBMS再利用。在写事务提交时,不管读拷贝(老的已提交物理内容项)是否被释放,版本列表都被重分配,并且逻辑元组直接指向新的已提交内容项。
如前所述,在读操作执行完成时,该读操作将它读取的所有物理内容项的引用计数递减。如果写事务对物理内容项执行了延迟删除,则已提交物理内容项的引用计数必须为正。最终所有读操作都执行完,并且该物理内容项的引用计数减到零。将引用计数减少到零的读操作检查看该内容项是否先前被写事务标记为删除。在这种情形中(延迟删除),读操作重置该物理内容项的分配位,使其可由DBMS用于再利用。注意,读操作通过关闭分配位而不必写任何日志记录来重分配物理内容项。
即使在存在延迟删除的情形中,版本化控制系统也是免受垃圾困扰的。如果当前没有读操作正在访问数据记录的读拷贝,则只要新的写事务完成就丢弃读拷贝。另外,最后的读操作清除物理内容项。因此,物理内容项被分配的时间一点都不超过绝对必需的时间。
对于分类和其他类似的需要SQL快照隔离的事务,延迟删除允许读操作仅通过拷贝逻辑元组指针就可以重新访问它们的临时空间中的数据记录。这允许分类事务管理正被读取的物理内容项的引用计数和生命期。
一般来说,版本化技术导致低效的索引维护。但是,通过使用本发明的版面控制方案的各个方面实现了快速索引维护。每个索引中的每个条目都具有已提交/未提交位。下面将针对三类写操作(插入、删除和更新)说明如何设置该位。对于插入逻辑元组,未提交内容项被插入到索引中,并且对应的索引条目被标记为已提交。对于删除逻辑元组,直到提交为止不采取动作。在事务提交时,索引条目被删除,并且对应的位无意义。对于更新逻辑元组,如前所述,新的物理元组(未提交内容项)被插入到索引中,并且对应的位被标记为“未提交”。在该事务提交时,索引条目被更新来将相同的条目标记为“已提交”。另一方面,如果该事务回滚,则仅移除索引条目。然后,在引用错误的索引条目时,索引扫描接收到空值。


图1是使用版本控制系统的数据库系统的框图。
图2是示出了在数据库系统中版本控制相同如何工作的框图。
图3和图4是更详细地示出了版本控制系统的工作的框图。
图5示出了在分类操作期间版本控制系统如何工作。
图6和图7示出了在数据库系统中索引如何被控制。
具体实施例方式
图1图示了一种数据库系统,其包括数据库8和处理器4(中央处理单元(CPU)和存储器),处理器4存储和执行用于数据库管理系统(DBMS)6和版本控制系统10的软件。在一个示例中,包含处理器4的计算设备2是服务器。这种系统也称作数据库服务器。处理器4可以是在服务器2中工作的单个CPU或多个CPU。数据库8一般存储在多个直接访问存储设备(DASD)中,尽管在图1中只示出了一个这种设备。DASD可以例如是盘组(disk pack),并且本领域技术人员可以理解数据库系统包括所需DASD控制器和在数据库8和处理器4之间建立通信的通道。在另一个示例中,数据库(8)可以存储在主存储器(4)自身内。
终端1是任何输入/输出(I/O)设备,其接收来自数据库用户的请求并且将结果返回给数据库用户。例如,终端可以是个人计算机(PC)或使用公开的应用编程接口(API)的应用。事务和查询从终端1被提交,并且由DBMS6并发处理。数据库8中的数据的不同版本由版本控制系统10维护。
图2更详细地描述了版本控制系统10。逻辑表12包含一组逻辑元组14。每个逻辑元组14或者直接指向物理表16中的物理内容项18,或者指向版本列表20。例如,逻辑元组14A包含直接指向物理内容项18A的指针,而逻辑元组14B包含指向版本列表20的指针。逻辑元组14包含标志字段222,其指示该逻辑元组指向版本列表还是直接指向物理元组。
排他锁(X锁)302与逻辑元组14相关联,并且指示来自一个事务的写操作已把来自其他事务的写操作关在外面,使其不能访问同一逻辑元组。这些锁由DBMS管理。例如,锁管理器300中来自一个事务的X锁302B防止其他事务下的写操作访问逻辑元组14B。可以访问逻辑元组14的任何操作都首先通过检查逻辑元组14中的标志222来检查关联的版本列表是否存在。对设置了版本列表标志222的逻辑元组进行访问的操作访问关联的版本列表。
物理表空间16包含也被称作内容项的物理元组。当对数据记录的写操作完成后,但是在其系主事务(owner transaction)提交之前,数据记录(逻辑元组)在物理表空间中有两个物理版本。已提交内容项仅对读操作可用,而未决内容项仅对创建该项的写事务可用。例如,逻辑元组14B被写操作修改。写操作从逻辑元组14B的原始已提交内容项18B创建拷贝18B′。已提交内容项18B对任何读操作可用。然而,未决内容项18B′仅对创建该未决内容项18B′的写事务可用。
元组版本列表20包括三个字段。(1)“系主Id”字段,该字段包含创建版本列表20的事务的唯一标识符。例如,创建了未决内容项18B′的写事务的事务Id(XID)位于系主Id字段22中。(2)“已提交内容项”字段24,该字段包含一个指针,该指针指向物理表空间16中的已提交物理内容项18B。(3)“未决内容项”字段26,该字段指向物理表空间16中的未决内容项18D′。
图3图示了在没有与特定物理内容项18A相关联的活动事务时的数据库。在该情形中,逻辑元组14A直接指向已提交内容项18A,并且不存在元组版本列表20。例如,逻辑元组14A中的地址值直接指向物理元组18A在物理表空间16中的地址位置。
物理内容项18具有关联的删除标志30、分配标志32和引用计数34。删除标志30用于标记要删除的物理内容项。分配标志32用于标识当前空间被分配。引用计数34标识当前引用物理内容项的读操作的数目。
插入、删除或更新中的任一个被统称为写操作38。包括读操作在内的所有操作在具有关联的XID的事务下发生。当写操作38创建逻辑元组时,该操作经过下述步骤。插入操作38在物理表空间16中创建新物理内容项18B,并且还创建关联的版本列表20。然后其创建指向该版本列表20的新逻辑元组14B。版本列表20中的系主Id字段22包含写操作38的事务Id(XID)36。已提交内容项字段24被设置为空,并且未决内容项字段26指向新插入的物理内容项18B。这些操作完成了将新逻辑元组插入到表空间中。
除了上述写事务38之外的某些事务进行的表扫描将只看到版本列表20中的已提交内容项字段24。在发现字段24为空时,该事务将跳过逻辑元组14B。由于写事务38的事务Id 36与系主Id字段22中的值匹配,所以写事务38进行的扫描将查看未决内容项字段26。一旦写事务38提交,版本列表20就被销毁,逻辑元组中的指示符222被设置为0,并且逻辑元组14B直接指向物理元组18B。此时,内容项18B的删除标志30未被设置。分配标志32是与物理内容项18B被创建时相同的值,该值向DBMS6(图1)指示表空间16中的物理地址空间当前被分配给内容项18B,引用计数34被设置为0。
延迟删除删除操作与上述插入操作非常类似。删除操作与插入操作唯一的差别在于在删除逻辑元组14B时,版本列表20中的已提交内容项24将指向已提交内容项18B,并且未决内容项26为空。使用与针对插入操作描述的相同的逻辑,其他事务将看到逻辑元组14B的前一值(即,已提交内容项18B)。当前事务38将跳过该逻辑元组14B。
图4示出了当对现有逻辑元组14B执行更新操作38时的情形。在创建未决内容项18B′后,但在事务完成前,写操作38可能需要重新访问逻辑元组14B。逻辑元组14B指向版本列表20。由于系主Id字段22中的事务Id 36与写操作38的事务Id 36相匹配,所以该操作使用版本列表20中的未决内容项字段26来达到未决内容项18B′。因此,写操作38只看见未决内容项18B′。该写事务所作的所有后续更新都被施加到未决内容项18B′。如果已存在版本列表20(例如,来自先前的插入操作),则这些更新操作38改变该版本列表20,如果不存在则创建一个新的。在这种版本列表中,已提交内容项字段24指向已提交内容项18B,并且未决内容项字段26指向未决内容项18B′。版本列表20中的系主Id字段22包含写事务38的事务Id(XID)36。
任何写操作38首先通过请求对应逻辑元组上的X锁,例如X锁302B(图2),从而获得逻辑元组(数据记录)14B上的排他锁。这允许在给定时刻只有一个写事务写到逻辑元组。然而,任何读操作(例如,另一个事务Id 36B的读操作39部分)都可以在X锁302B被设置时读取已提交内容项18B(如果存在的话)。这种操作符合美国国家标准研究所(ANSI)的READ COMMITTED隔离级别。READ COMMITTED隔离意味着任何读操作都应当读取数据记录(逻辑元组)的最后提交的版本。
在执行删除或更新操作的那些事务被提交时,需要从物理表空间移除老的已提交内容项。然而,这些写操作38的行为基于与已提交内容项18B相关联的引用计数34而被修改。对于每个访问对应的逻辑元组14B的读操作39,已提交内容项18B的引用计数34都被递增。当执行写操作38的事务提交并完成所需的对逻辑元组14B的修改后,其将重分配版本列表20,并且重分配关联的老的已提交物理内容项18B。
内容项18总是先被创建,然后再被删除。对逻辑元组的更新和删除操作总是删除先前已提交的内容项。当执行写操作38的事务完成后,该事务将试图删除老的已提交内容项18B,并且将使未决内容项18B′成为物理表16中的新的已提交内容项。
写操作38首先检查老的已提交内容项18B的引用计数34。如果引用计数34为零,则写事务38取得对该老的已提交内容项18B的完全控制,然后通过重置分配标志32来将其删除。如果引用计数34不为零,则写事务38通过设置删除标志30并且压入所有必要的日志记录45来将内容项18B标记为被删除。在当前读取内容项18B的读操作39完成后,其递减引用计数34。如果引用计数34为零,则读操作39检查是否设置了内容项18B的删除标志30。如果删除标志30被设置了,则读操作39通过重置分配标志32来从物理表空间16有效地移除内容项18B。老的已提交内容项18B现在可由DBMS 6用来分配给另一个内容项。
在上述“延迟删除”方案中,读操作39担任内容项18B的系主,并且在不必压入任何日志记录的情况下完成删除。其他策略与延迟删除相结合工作,以使得可以执行恢复和撤消操作。检查指针假定对内容项的删除已实际完成,并且盘上数据库的拷贝总是显示出该内容项被标记为“删除的”和“自由的”。恢复过程也确认所有不忙的内容项被标记为自由的。
术语“元组生命期”描述对于引用事务要求物理元组(内容项)存在的时间。对于READ COMMITTED隔离的读操作,所引用的元组的元组生命期是将该元组拷贝到应用缓冲区中所需的时间。对于任何写操作,包括READ COMMITTED隔离的写操作,被修改的元组的生命期是修改事务的生命期。例如,在元组的生命期期间,该逻辑元组上的X锁被保持,同时未决内容项存活并且不能被任何其他事务修改,直到该事务结束。在基于并发控制方案的简单加锁中,元组项上的共享锁被保持,以保证该元组存在,直到读事务完成将该元组值拷贝到其缓冲区中。当前方案的一个效果是任何只读事务都不必保持锁。
分类(sort)“分类”是可能需要多次读相同数据的一组操作的代表。分类的示例有联结(join)、分组(group by)和区分属性(distinct attribute)等。执行分类的读操作可以从物理表读出一组内容项。读操作获得对在执行分类操作期间可能删除的任何内容项的所有权,并且在该分类操作完成后删除所有这种内容项。
延迟删除被扩展到需要语句级一致性的语句。例如,分类操作需要语句级一致性来确保分类实际终止。在由分类访问的内容项在执行分类时可能改变的情形中,不存在终止保证。我们的方案保证引用计数大于零的任何内容项都将不会从表空间删除。需要语句级一致性的任何事务都可以递增所有被访问的内容项的引用计数。在语句的结束处,所有内容项的引用计数被递减。
图5示出了包含地址值ID1~ID 5的一组逻辑元组50。逻辑元组50中的地址值指向物理表空间T1中的对应物理元组52。在本示例中,每个物理元组52具有“A”列数据记录和“B”列数据记录。
分类操作58的一个示例如下(select*from T1 and order by B)。
在分类操作58中,表T1中的所有物理元组52都将根据列B中的值而被重排序。在一些其他数据库系统中执行的分类操作如果要保持较高的并发,就可能必须将所需的物理元组52从表T1拷贝到另一个临时表中。该临时表中的物理元组的拷贝在它们被使用之前被该操作分类。这种方案要求大量的存储器用于存储第二组元组。此外,元组52的第二拷贝不能与其他事务共享。或者,事务可能在整个分类期间必须保持锁,这严重限制了系统中的并发。ORACLE数据库系统通过利用多个版本解决了该问题,但是由于不维持对先前版本的快速访问路径,所以严重限制了数据库系统的执行速度。
但是,在本发明的数据库系统中,取代创建物理元组52的第二拷贝,逻辑元组50的第二拷贝55被创建。逻辑元组的第二拷贝55仅包含地址ID1~ID5,并且在大小上一般远比物理元组52小。分类操作58仅读取物理元组52。因此,其他事务可以访问相同的物理元组52。
由分类操作58引用的所有物理元组52的引用计数34都被递增。在本情形中是物理表空间T1中的每个物理元组52。这确保物理元组52不被删除,直到分类事务58完成。如果写事务56改变了任何物理元组52的内容,则上述延迟删除方案允许分类操作58控制何时老的已提交物理元组52被重分配。
在分类操作58期间,逻辑元组55根据物理元组52的数据列B中的值而被分类。分类后的最终逻辑元组集合在表60中示出。被写事务56删除的任何物理元组52的删除标志30被设置。分类操作58将删除标志30被设置的物理元组52的分配标志32重置。对于未被写事务56标志为删除的物理元组52,分类操作58不重置其分配标志32。
索引图6示出了版本控制系统的另一个特征,其中索引扫描区分出索引60中的已提交和未提交条目。对于删除操作,索引方案通常要求两次或更多次索引查找,对于更新和插入操作则需要多次索引查找。上述版本控制系统对于插入和删除操作仅需一次索引查找,而对于更新操作需要三次索引查找。现有的优化技术可以用来进一步降低更新操作的查找成本。
为了实现高效查找,除了前述三种组件外,版本列表70还存储多个索引条目的列表。每个受影响的索引具有复制的索引条目。对于逻辑元组插入和删除操作,不保持受影响索引的列表,这是由于这些操作影响所有索引。例如,逻辑元组的插入要求对下层表中的所有索引执行插入操作。即,每个索引每次逻辑元组插入进行一次索引查找操作。当事务(对数据记录执行删除操作的事务)提交时,该对应逻辑元组的所有索引条目都必须从所有索引中删除。这导致每个索引每次逻辑元组删除进行一次索引查找操作。
然而,每个更新操作在对应的版本列表中保持一列受影响的索引。在逻辑元组被更新时,具有未提交标记的新条目被插入到所有受影响的索引中。在逻辑元组被提交时,该逻辑元组的所有受影响索引的已提交索引条目被删除,并且所有未提交的条目被标记为已提交。
在一个示例中,插入操作创建逻辑元组68,又创建内容项84,版本列表70和索引条目64A。索引条目64A指向逻辑元组68。版本列表70中的未决内容项字段74最初指向已提交内容项84,并且已提交内容项字段76为空。
在更新操作80中,索引条目64A和逻辑元组68已存在。更新事务80从已提交内容项84创建未决物理内容项86。这样的版本列表70被创建,其中已提交内容项字段74指向已提交内容项84,并且未决内容项字段76指向未决内容项86。
更新操作80引起创建新的索引条目66A,该索引条目66A对应于未决内容项86。通过设置标志66B,新的索引条目66A被标记。标记过的索引条目引用内容项的新的未决版本,而未标记的条目引用该内容项的已提交版本。索引被标记为受影响的意味着在索引62中存在双条目。版本列表70还包括索引图78,其标识出具有双条目的索引。在这种情形中,索引图(index map)78标识出索引62具有双条目64A和66A。
在索引扫描期间,执行更新操作80的事务90可以接收索引条目64A。索引条目64A经由逻辑元组68指向版本列表70。该事务90具有与包含在版本列表70的系主Id字段72中的相同的XID,而且索引62在索引图78中被标识出。因此,空值被返回给事务90,这防止事务90使用与已提交内容项84相关联的索引条目64A。
索引扫描相应地跳过索引条目64A,并且向事务90提供标记过的索引条目66A。标记过的索引条目66A经由逻辑元组68指向版本列表70。由于索引条目66A是标记过的,并且事务Id与系主Id字段72中的Id匹配,所以事务90的读操作(也称作扫描)被提供以未决内容项字段76中的值,该值指向未决内容项86。该过程确保更新事务使用正确的索引条目66A来访问未决内容项86。
图7是更详细地描述了上述索引方案的流程图。图6中示出的版本列表70由系主XID引用,其中该XID包含更新了逻辑元组68的操作的事务Id。已提交元组Id(committedTupId)项引用逻辑元组的先前版本的物理元组Id。未提交元组Id(uncommittedTupId)项引用逻辑元组的新版本的物理元组Id。IndexMap项引用所有受影响的索引的位图,并且在一个实施例中仅针对更新事务被填充。但是,扫描器分析插入、删除、受影响的索引和未受影响的索引。
版本列表(version-list)引用logicalTuple.vList。项“标记(mark)”标识索引条目中的已提交或未提交标记。IndexId是表示被扫描的索引条目的位图。对于插入,将仅有一个被标记为已提交的索引条目。
在框92中,DBMS确定逻辑元组是否被版本化。没有被版本化的逻辑元组不被进一步分析,并且在框90中逻辑元组指向的物理元组被返回给扫描器。如果逻辑元组被版本化,则逻辑元组指向版本列表。当扫描器看到索引条目时,其被以下述方式分解。如果索引是受影响的索引,则存在两个索引条目。第一索引条目未针对已提交而被标记,其代表逻辑元组的前一版本在索引中被放置的位置。第二索引条目针对未提交的拷贝被标记,其代表逻辑元组在索引中的新位置。
在框96中,如果索引条目被标记为已提交;并且事务Id与版本列表中的系主Id相匹配,或者事务Id代表一个已提交事务;并且通过对受影响索引位图中的索引Id的成员进行检查确认索引条目代表受影响的索引,则在框94中NULLID(空ID)被返回给扫描器,并且假定物理内容项条目不存在。
如果在框100中索引条目被标记为已提交,或者在框104中被标记为未提交,并且事务Id(XID)与vlist匹配,或者如果XID代表已提交事务,则在框98或框102中未提交元组Id被返回。如果在事务和版本列表之间不存在XID匹配,或者系主XID不是已提交事务,则在框108中已提交元组Id被返回。对于删除这同样为真,并且对于未受影响的索引相同的逻辑也为真。
图7中的逻辑可替换表示如下if(逻辑元组未版本化)Return logicalTuple.physicalTupleIf(mark==committed&&
(((current xid=vlist.ownerXID)‖(vlist.ownerXID.committed=TRUE))&&
(vlist.indexMap & indexed)))return SB_NULLID;
else if(mark==committed&&
(current xid=vlist.ownerXId ‖vlist.ownerXID.committed=TRUE))return vlist.uncommittedTupId;
else if(mark==uncommitted&&
(current xid=vlist.ownerXId ‖vlist.ownerXID.committed=TRUE))return vlist.uncommittedTupId;
elsereturn vlist.committed;上述方案符合ANSL SQL标准,其中仅更新事务看见其自己的更新,并且读事务仅看见已提交数据。这种实现符合ANSI READ COMMITTED隔离级别。
更新事务的所有效果在一个步骤中变得对读事务可见。如图7所示,所有事务都具有已提交字段,当针对该事务执行了提交判决后该字段被设置为TRUE(真)。在已提交字段被设置后,通过沿着未提交物理元组Id,所有扫描器都看到逻辑元组的更新值。一旦对提交的判决已执行,就在无需保持销或锁的情况下实现了原子提交。然后对逻辑元组的清除可以惰性执行。
这里所述的方案可很容易地移植到可串行化事务,其中可串行化事务遵循两阶段加锁方案。为了确保索引的一致性,可以在可串行化索引扫描遇到的任何条目上使用共享锁。在由索引条目指向的逻辑元组上的读锁可以被获得。一旦获得该锁,并且发现索引条目“在更新中”,则事务必定是在修改该元组。在这种情形中,未决内容项Id被返回。如果发现索引条目未被标记,则如果逻辑元组的系主Id与当前事务的事务Id相匹配,则该索引条目被忽略,否则已提交内容项Id被返回。
总结本发明的不同方面提供了代表非可串行化事务的非阻塞读,即对数据记录的读取不被延迟。不需要对数据记录的读和写之间的依存关系,允许写之间具有依存关系,但是不要求与任何读操作之间的依存关系。在读操作读数据记录时提供了高效的版本定位。由于不存在延迟的一致性检查,所以事务不需要由于除了“写”操作死锁之外的任何其他原因而在提交时被回滚,这种“写”操作死锁是在执行写操作期间而不是在提交时肯定会遇到的。此外,还提供了无垃圾的执行,其中数据记录的版本不在数据库中存在超过所需要的时间。有效精简的隔离支持使得能够在精简隔离级别上执行事务,这包括有效地定位要被读取的版本。
非阻塞事务许可不会由于任何锁冲突而使事务延迟,并且数据的年龄被限界。在存在同一数据记录的多个版本时提供了有效的索引管理,并且向快照提供了简单的可扩展性同时维持几乎没有垃圾的执行性能。此外,事务不必预先声明它们是只读的或者读写的。
上述系统可以使用专用处理器系统、微控制器、可编程逻辑器件、或者执行这些操作中的一些或全部的微处理器。上述操作中的一些可以实现在软件中,并且其他操作可以实现在硬件中。
为了方便,这些操作被描述为各个互连的功能块或不同的软件模块。但是这不是必需的,也可以存在这样的情形这些功能块或模块被等价聚集到没有清晰边界的单个逻辑器件、程序或操作中。无论如何,功能块和软件模块,或者柔性接口的特征可由它们自身实现,或者在与硬件或软件中的其他操作的组合中实现。
已在本发明的优选实施例中描述并图示了本发明的原理,应当清楚,在不脱离这些原理的情况下,可以在布置和细节上对本发明作出修改。本发明要求在所附权利要求书的精神和范围内的所有修改和变体。
权利要求
1.一种用于处理数据的方法,包括从已提交内容项为第一事务创建未决内容项;提供对所述已提交内容项的第二事务读访问,同时提供对所述未决内容项的所述第一事务写/读访问;在所述第一事务提交所述未决内容项时将所述已提交内容项加标志为删除的;以及延迟重分配所述已提交内容项,直到所述第二事务完成对所述已提交内容项的访问。
2.如权利要求1所述的方法,包括每次读事务访问所述已提交内容项时递增引用计数;每次读事务完成对所述已提交内容项的访问时递减所述引用计数;以及将所述引用计数递减到零的读事务发起对所述已提交内容项的重分配。
3.如权利要求2所述的方法,包括在所述第一事务提交所述未决内容项时将所述已提交内容项加标志为删除的;当完成的读事务将所述引用计数减少到零时检查所述已提交内容项是否被加标志为删除的;以及仅当所述已提交内容项已被加标志为删除的并且具有为零的引用计数时,所述读事务重分配所述已提交内容项。
4.如权利要求1所述的方法,包括创建具有第一字段、第二字段和第三字段的版本列表,其中所述第一字段指向所述已提交内容项,所述第二字段指向所述未决内容项,并且所述第三字段存储所述第一事务的事务Id;将所述版本列表中的所述第二字段提供给与所述版本列表的所述第三字段中的所述事务Id匹配的事务,而将所述第一字段提供给与所述版本列表的所述第三字段中的所述事务Id不匹配的事务。
5.如权利要求4所述的方法,包括生成逻辑元组;在没有写事务正访问所述已提交内容项时使用所述逻辑元组直接指向所述已提交内容项;以及在写事务正访问所述已提交内容项时使用所述逻辑元组指向所述版本列表。
6.如权利要求4所述的方法,包括将索引中的索引条目标记为已提交或未提交;在所述版本列表中提供索引图,所述索引图标识具有已提交和关联的未提交双条目的索引;为了索引条目而扫描所述索引;以及根据所述索引条目标记和包含在所述索引图中的所述索引返回空值。
7.如权利要求6所述的方法,包括在所述索引条目不与所述索引图相关联并且发起所述索引扫描的事务的标识符(Id)与所述版本列表的所述第三字段中的所述事务Id匹配时,返回指向所述未决内容项的指针。
8.如权利要求7所述的方法,包括在所述索引条目不与所述索引图相关联并且所述发起所述索引扫描的事务的标识符(Id)与所述版本列表的所述第三字段中的所述事务Id不匹配时,返回指向所述已提交内容项的指针。
9.如权利要求2所述的方法,包括提供逻辑元组;拷贝在要求数据“快照”的操作中标识出的逻辑元组的集合;递增与所拷贝的逻辑元组的集合相关联的所述物理内容项的引用计数;在该操作完成时递减所述物理内容项的所述引用计数;以及重分配具有删除标志并且引用计数为零的任何所述物理内容项。
10.一种数据库系统,包括包含物理内容项的数据库;和处理器,所述处理器为写事务从已提交内容项创建未决内容项,并且提供对所述已提交内容项的读事务访问,并提供对所述未决内容项的所述写事务访问,所述处理器在所述写事务提交所述未决内容项时将所述已提交内容项加标志为删除的,并且延迟重分配所述已提交内容项直到所述读事务完成对所述已提交内容项的访问。
11.如权利要求10所述的数据库系统,其中,所述处理器在每次读事务访问所述已提交内容项时递增引用计数,并且每次所述读事务完成对所述已提交内容项的访问时递减所述引用计数,所述处理器在所述已提交内容项先前已被标记为删除的并且所述读事务将所述引用计数递减为零时重分配所述已提交内容项。
12.如权利要求11所述的数据库系统,其中,所述处理器创建具有第一字段、第二字段和第三字段的版本列表,其中所述第一字段指向所述已提交内容项,所述第二字段指向所述未决内容项,并且所述第三字段存储创建所述未决内容项的事务的事务Id,所述处理器将所述版本列表中的所述第二字段提供给与所述第三字段中的所述事务Id匹配的事务,而将所述第一字段提供给与所述第三字段中的所述事务Id不匹配的事务。
13.如权利要求12所述的数据库系统,其中,所述处理器在所述写事务被完成时使用所述逻辑元组直接指向所述已提交内容项,而在所述写事务已创建所述未决内容项时使用所述逻辑元组指向所述版本列表。
14.如权利要求12所述的数据库系统,其中,所述处理器将索引中的索引条目标记为已提交或未提交,并且在所述版本列表中提供索引图,所述索引图标识所述索引中的已提交和关联的未提交双条目,所述处理器针对第一事务扫描所述索引,并且在所扫描的索引条目被标记为已提交并且所述索引条目被所述索引图引用时返回空值。
15.如权利要求14所述的数据库系统,其中,在所述索引条目未被所述索引图引用并且发起所述索引扫描的事务的标识符(Id)与所述版本列表的所述第三字段中的所述事务Id匹配时,所述处理器返回指向所述未决内容项的指针。
16.如权利要求15所述的数据库系统,其中,在所述索引条目未被所述索引图引用并且发起所述索引扫描的事务的标识符(Id)与所述版本列表的所述第三字段中的所述事务Id不匹配时,所述处理器返回指向所述已提交内容项的指针。
17.如权利要求10所述的数据库系统,其中,所述处理器提供指向物理内容项的逻辑元组,并且拷贝在分类事务中标识出的逻辑元组的集合;所述处理器递增与所拷贝的逻辑元组的集合相关联的物理内容项的引用计数,在所述分类事务完成时递减所述物理内容项的所述引用计数,并且重分配具有删除标志并且引用计数为零的任何所述物理内容项。
全文摘要
本发明提议了双拷贝版本化方案。该方案高效实现了高读负载数据库,并且消除了读依存关系。该版本化方案提供了在ANSI READ COMMITTED隔离下执行的事务的高效实现,并且可扩展到可串行化隔离。该双拷贝版本化方案免受垃圾影响,既意味着在执行期间使用数据记录的所有版本,并且该方案适于索引扫描操作。“延迟删除”方案允许读事务完成数据重分配操作。要求“快照”的语句也得到了有效的支持。
文档编号G06F17/30GK1864137SQ200480022622
公开日2006年11月15日 申请日期2004年8月6日 优先权日2003年8月6日
发明者桑贾伊·韦马, 马克·L·麦考利夫, 雪利·利斯特戈泰恩, 斯巴散卡·黑尔达, 航起金 申请人:甲骨文国际公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1