多索引数据库事务处理方法及数据库的制作方法

文档序号:6489679阅读:188来源:国知局
多索引数据库事务处理方法及数据库的制作方法
【专利摘要】本申请涉及一种多索引数据库事务处理方法,所述数据库包含至少一行数据,所述多索引指向所述行数据中的至少一列数据,所述方法包括:生成全局有序的最新事务版本号;以所述最新事务版本号为标记,对所述数据库进行写事务处理,并更新所述写事务处理后所述数据库中的数据对应的多个索引;提交所述写事务处理数据,将所述数据库的全局事务版本号更新为当前最新事务版本号。本申请能够实现一种满足多索引的数据库中,对数据库进行事务处理时,能够保证数据库的ACID特性。
【专利说明】多索引数据库事务处理方法及数据库
【技术领域】
[0001]本申请涉及计算机领域,具体涉及到一种多索引数据库写事务处理方法、多索引数据库读事务处理方法及数据库。
【背景技术】
[0002]数据库(Database )是按照数据结构来组织、存储和管理数据的仓库。数据库有很多种类型,从最简单的存储有各种数据的表格到能够进行海量数据存储的大型数据库系统都在各个方面得到了广泛的应用。为了提高在数据库中查询数据的效率,数据库需要对一些字段建立索引。以便于按照条件进行查询的情况下,可以先查询索引,并通过索引查找到相关的书库。数据库的索引通常有几种类型,例如顺序索引、散列索引或者位图索引等索引类型。
[0003]现有技术中,数据库通常只对数据建立一种索引。采用一种索引方式进行查询,优点在于能够对特定的请求得到较高效率的查询,但是对于特定请求之外的查询,则相对另一种索引方式,效率就会相对较低。
[0004]因此,可以设想将两种或者多种以上的索引结合到同一数据库中,以提高针对不同需求对数据库中的数据进行查询时的查询效率。但是,由于数据库需要在更新数据时保证对书库与索引的更新事务的原子性、一致性、隔离性、持久性,简称ACID (AtomicityConsistency Isolation Durability)特性,因此,本申请的目的就是提供一种多索引的数据库事务实现方法,能够在更新数据时保证对书库与索引的更新事务的ACID特性,并且提高对数据库内数据的检索效率。

【发明内容】

[0005]有鉴于此,本申请的目的是提供一种多索引数据库事务处理方法,以实现在更新数据时保证对书库与索引的更新事务的ACID特性,并且提高对数据库内数据的检索效率。
[0006]一方面,本申请实施例提供一种多索引数据库事务处理方法,所述数据库包含至少一行数据,所述多索引指向所述行数据中的至少一列数据,所述方法包括:
[0007]生成全局有序的最新事务版本号;
[0008]以所述最新事务版本号为标记,对所述数据库进行写事务处理,并更新所述写事务处理后所述数据库中的数据对应的多个索引;
[0009]提交所述写事务处理数据,将所述数据库的全局事务版本号更新为当前最新事务版本号。
[0010]另一方面,本申请实施例提供一种多索引数据库事务处理方法,所述方法包括:
[0011]获取所述数据库的最新事务版本号;
[0012]根据设定的读取请求方式,采用至少一种索引查询所述数据库中的数据;
[0013]读取查询到的所述数据库中的数据,并返回具有不晚于所述最新事务版本号的行数据版本号的数据。[0014]另一方面,本申请实施例提供一种数据库,包括:
[0015]生成单元,用以生成新的全局有序的最新事务版本号;
[0016]写事务处理单元,用以以所述最新事务版本号为标记,对所述数据库进行写事务处理,并更新所述写事务处理后所述数据库中的数据的对应的多个索引;
[0017]更新单元,提交所述写事务处理数据,将所述数据库中的数据的全局事务版本号更新为当前最新事务版本号。
[0018]另一方面,本申请实施例提供一种数据库,包括:
[0019]获取单元,用以获取所述数据库的最新事务版本号;
[0020]查询单元,用以根据设定的读取请求方式,采用至少一种索引查询所述数据库中的数据;
[0021]读取单元,用以读取查询到的所述数据库中的数据,并返回具有不晚于所述最新事务版本号的行数据版本号的数据。
[0022]本申请实施例提供的多索引数据库事务处理方法,为数据库建立了两种或两种以上的不同种类的索引之后,在处理数据库事务时首先为数据库生成全局有序的最新事务版本号,之后以事务版本号为标记,对所述数据库进行写事务处理,并更新所述写事务处理后所述数据库中的数据对应的多个索引,最后在完成全部索引的更新后提交所述写事务处理数据,将所述数据库的全局事务版本号更新为当前最新事务版本号。从而保证了在多索引的数据库中,对数据库进行事务处理时,能够保证数据库的ACID特性。
【专利附图】

【附图说明】
[0023]为了更清楚地说明本申请实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
[0024]图1为本申请实施例提供的多索引数据库处理方法一实施例的流程图;
[0025]图2为本申请实施例提供的多索引数据库处理方法一实施例的流程图;
[0026]图2A为本申请实施例提供的单表多行的单个写事务处理的处理流程图;
[0027]图3为本申请实施例提供的多索引数据库处理方法一实施例的流程图;
[0028]图3A为本申请实施例提供的多表多行的单个写事务处理的处理流程图;
[0029]图4为本申请实施例提供的插入一行数据的处理流程图;
[0030]图5为本申请实施例提供的删除一行数据的处理流程图;
[0031]图6为本申请实施例提供的更新一行数据的处理流程图;
[0032]图6A为图6中步骤601的详细流程图;
[0033]图7为本申请实施例提供的多索引数据库处理方法一实施例的流程图;
[0034]图8为本申请实施例提供的数据库一实施例的结构图;
[0035]图9为本申请实施例提供的数据库另一实施例的结构图。
【具体实施方式】
[0036]下面通过附图和实施例,对本申请的技术方案做进一步的详细描述。[0037]数据库常常包含大量的数据,为了提高查询效率,数据库需要对一些字段建立索弓丨,这样按条件查询的时候,可以先查询索引并通过索引找到相关的数据。数据库索引有几种类型,例如顺序索引、散列索引和位图索引等。顺序索引可以同时支持范围查询和单项查询,针对一组字段,数据库常常只建立一种索引。但是,由于散列索引和位图索引等通常都难以实现范围查询,因此已有的数据库通常使用顺序索引,例如基于B/B+树的顺序索引。
[0038]单一索引对某一部分请求可能很高效,对另一部分请求不太高效。例如,顺序索引对于实现范围查询比较高效,对随机查询则不太高效:假设索引针对的字段个数是K,数据库表的行数是N,那么通过顺序索引查询单个项所需要的比较次数大约是K*log(N),例如,当K=l,N=IO6时,比较的次数大约是l*log(N)=20,当K=5,N=IO9时,比较的次数大约是5*log(N) =150,因此使用顺序索引进行随机查询所需要的比较次数较多并且随着数据库表的条数的增加而增加。反之,散列索引由于需要遍历整个表因此对范围查询很低效,但对单项的随机查询比较高效,所需的比较次数常常只是略大于K并且与数据库表的条数基本无关,当K=1,N=106以及当K=5,N=109时,单个项的随机查询所需的比较次数略大于I和5,低于顺序索引时所需要的20和150次。
[0039]本申请通过对数据库一组字段同时建立两种或者两种以上的索引,例如顺序索引和散列索引。其中一种索引用来进行一类查询,另一种索引用来进行另一类查询。例如以顺序索引)进行范围查询,而以散列索引进行单项查询。使用不同的索引进行不同类型的查询可以进一步提高查询速度,例如针对单项查询,散列索引通常只需要一次比较运算即可定位到目标行,提升了数据的读写事务的性能。
[0040]但是,维护双索引的技术难度主要在于需要保证对数据与索引的更新事务满足原子性、一致性、隔离性和持久性,也就是数据库的ACID特性。即对数据的更新保证与多个索引同时可见或同时不可见;正在更新的数据和多个索引不能被读到;无论数据更新事务是否成功,都不能破坏数据库的完整性约束。
[0041]为此,本申请实施例提供了一种多索引数据库事务处理方法,所述数据库包含至少一行数据,所述多索引指向所述行数据中的至少一列数据,所述方法包括:生成全局有序的最新事务版本号;以所述最新事务版本号为标记,对所述数据库进行写事务处理,并更新所述写事务处理后所述数据库中的数据对应的多个索引;提交所述写事务处理数据,将所述数据库的全局事务版本号更新为当前最新事务版本号。
[0042]通常在本申请的实施例中,所述写事务处理进一步包括单个写事务处理和多个写事务处理。其中,所述单个写事务处理进一步包括单表单行的单个数据库修改和单表多行的数据库修改以及多表多行的数据库修改。
[0043]相应的,所述的多个写事务处理包括串行执行的多个写事务处理和并发执行的多
个写事务处理。
[0044]更进一步的说,在本申请的实施例中,所述单表多行的数据库修改包括:首先进行一行数据的单个数据库修改;如果对所述的一个单个数据库修改失败,结束所述单表多行的数据库修改处理,将数据库恢复到未进行所述单表多行的数据库修改处理之前的状态;如果对所述行数据的单个数据库修改成功,则进行下一个行数据的单个数据库修改处理,直至完成所述单表中全部需要修改的行数据的数据库修改。
[0045]同理,在本申请的一实施例中,所述多表多行的数据库修改处理包括:首先,进行一个单表中一行数据的单个数据库修改;之后,如果对所述行数据的单个数据库修改处理失败,结束所述多表多行的数据库修改处理,将数据库恢复到未进行所述多表多行的数据库修改处理之前的状态;如果对所述的一个行数据的单个数据库修改处理成功,则进行下一个行数据的单个数据库修改处理,直至完成所述多表中全部的行数据的数据库修改处理。
[0046]更具体的,在本申请的实施例中,所述单表单行的数据库修改处理包括:向所述数据库中插入一行数据,并修改该行数据的版本号为所述最新事务版本号;之后,更新所述数据库中插入所述行数据后的多种索引中的每一种索引。或者删除所述数据库中的一行数据,并修改该行数据的版本号为所述最新事务版本号;之后,更新所述数据库中删除所述行数据后的多种索引中的每一种索引。再或者,更新所述数据库中指定位置的行数据,并修改该行数据的版本号为所述最新事务版本号;之后,更新所述数据库中更新所述行数据后的多种索引中的每一种索引。
[0047]在前述的几种在单表单行的数据库修改中,如果在进行所述单表单行的数据库修改处理后,破坏所述数据库的设定约束,则结束此次数据库写事务处理,将所述数据库中的数据回滚到执行所述数据库写事务处理前的状态。
[0048]较佳的,在所述更新所述数据库中指定位置的行数据,并修改该行数据的版本号为所述最新事务版本号中,如果更新的所述行数据不存在,则结束此次写事务操作,并将数据库恢复到未进行所述写事务操作之前的状态;或者,如果此次更新的内容不涉及所述多个索引中的一个索引对应的索引列,则不对所述多种索引中的每一种索引更新。
[0049]在本申请的优选实施例中,更新所述数据库中指定位置的行数据,并修改该行数据的版本号为所述最新事务版本号具体包括:修改数据库中行数据的版本号并保留行数据的历史版本。
[0050]实施例一
[0051]一种多索引数据库事务处理方法,其流程图可参考图1所示,所述数据库包含至少一行数据,所述多索引指向所述行数据中的至少一列数据。该实施例一关注于数据库的写事务处理,也就是对数据库中的数据进行增加、删除、修改的事务。由图1可见,所述方法包括:
[0052]步骤101,生成全局有序的最新事务版本号;
[0053]本实施例是以数据库中设置顺序索引和散列索引两种索引为例,但是在实际应用中,可以根据实际查询需要对相关字段建立其他种类的索引。
[0054]为了保证数据与多个索引更新事务的ACID特性:每个写事务处理可能修改多个表的多个行的多个列,所有这些修改都对应一个唯一的版本号mutation_ver,每个写事务的版本号各不相同,并且根据事务提交的顺序满足设定的全局的偏序关系,每行数据保存了它的全部列的最近若干次的修改历史版本,当某些修改历史版本不再需要时,它们被删除以便回收所占用的空间。
[0055]同时,生成一个全局有序的最新事务版本号,即事务版本号max_commited_transaction_id。以此全局有序的事务版本号保存当前已经提交的最新事务版本号,并且保证任何版本早于等于这个事务的其它事务都已经提交。
[0056]步骤102,以所述最新事务版本号为标记,对所述数据库进行写事务处理,并更新所述写事务处理后所述数据库中的数据对应的多个索引;
[0057]具体的,在该步骤102中,完成对数据库的写事务处理过程,例如向数据库中插入数据,删除数据库中的数据以及更新数据库中的指定位置的数据等。从写事务处理涉及的数目上区分,还可以划分为包括单个写事务处理和多个写事务处理。其中,单个写事务处理是指对数据进行的一次写事务处理,而多个写事务处理则是指对数据库进行多次写事务处理。
[0058]在单个写事务处理中,又进一步包括对单表单行的数据库修改和单表多行的数据库修改以及多表多行的数据库修改。
[0059]多个写事务处理则包括串行执行的多个写事务处理和并发执行的多个写事务处理。串行的多个写事务处理指按照顺序执行,多个写事务如果并发执行,则按上结合数据库常用的多版本并发控制或者其他类似方法进行。例如通过,行锁和范围锁等方式,实现多个并行执行事务对数据的修改。
[0060]步骤103,提交所述写事务处理数据,将所述数据库的全局事务版本号更新为当前最新事务版本号。
[0061]具体而言,在完成全部的单个写事务处理,或者是多个写事务处理之后。可以提交所述的写事务处理数据,数据库的全局最新更新为生成的当前事务版本号。也就是说,事务的提交就是相当于确认在这事务内对数据的修改操作已经“可见”,比如行A和行B,原来的值分别是I和2,事务内将其修改为3和4,但是在事务提交之前,其他同时读取的人只能读到I和2,只有在事务提交之后,才能读到3和4,此时数据可以的全局事务版本号也由提交之前的版本更改为新的当前最新事务版本号。
[0062]全局事务版本号用于读取行数据时应该读到那些数据,某一行数据会有多个版本(比如为vl,v2, v3),而当前最新事务版本号是v2,那么读到这行数据时,只会读到当前最新事务版本号之前的vl和v2的数据,由于v3>v2,因此它不会被读取出来。
[0063]实施例二
[0064]本实施例提供一种多索引数据库事务处理方法,其流程图可参考图2所示,所述数据库包含至少一行数据,所述多索引指向所述行数据中的至少一列数据。该实施例一关注于数据库的写事务处理,也就是对数据库中的数据进行增加、删除、修改的事务。由图2可见,所述方法包括:
[0065]步骤201,生成全局有序的最新事务版本号;
[0066]该步骤201与前述实施例中的步骤101相同,因此不多赘述。
[0067]步骤202,以所述最新事务版本号为标记,对所述数据库进行写事务处理,并更新所述写事务处理后所述数据库中的数据对应的多个索引;
[0068]具体的,在该步骤202中,完成对数据库的写事务处理过程中,单表多行的数据库修改处理的处理流程,如图2A所示,单表多行的数据库修改包括:
[0069]步骤2021,进行一行数据的单个数据库修改处理;
[0070]具体而言,对一行数据进行单个数据库修改处理,可以是对单表进行插入行、删除行数据或者修改一行数据中部分列数据的操作行为。如果在执行上述的几种操作后,违背了数据库的某个设定约束,则此次写事务处理失败。例如,比如某个数据范围内的行数不能超过一个值可以作为一个“约束”,用户向这个范围内插入数据的时候要保证这个范围内的函数不能超购某个值,否则成为破坏数据库的约束。
[0071]如果对所述行数据的单个数据库修改处理失败,则执行:
[0072]步骤2022,结束所述单表多行的数据库修改处理,将数据库恢复到未进行所述单表多行的数据库修改之前的状态;
[0073]具体的,执行一次单个数据库修改处理失败之后,由于在修改中保存了对此次修改,因为所有的修改操作都不是立即生效,而是记录操作,因此需要对数据库的数据进行回滚,也就是指将数据库恢复到没有修改之前的状态,回滚只需要将这个事务内记录的修改操作删除掉即可。
[0074]如果对所述行数据的单个数据库修改处理成功,则执行:
[0075]步骤2023,进行下一个行数据的单个数据库修改处理,直至完成所述单表中全部需要修改的行数据的数据库修改。
[0076]具体的,如果此次单个数据库修改处理没有违反数据库的某个设定约束,则此次数据库修改处理成功,可以取出下一个单表中的下一个行数据的单个数据库修改处理,例如对某个单表的下一行数据进行数据库修改处理,直至完成全部的写事务处理。
[0077]步骤203,提交所述写事务处理数据,将所述数据库的全局事务版本号更新为当前最新事务版本号。
[0078]实施例三
[0079]本实施例提供一种多索引数据库事务处理方法,其流程图可参考图3所示,所述数据库包含至少一行数据,所述多索引指向所述行数据中的至少一列数据。该实施例一关注于数据库的写事务处理,也就是对数据库中的数据进行增加、删除、修改的事务。由图3可见,所述方法包括:
[0080]步骤301,生成全局有序的最新事务版本号;
[0081]该步骤301与前述实施例中的步骤101和步骤201相同,因此不多赘述。
[0082]步骤302,以所述最新事务版本号为标记,对所述数据库进行写事务处理,并更新所述写事务处理后所述数据库中的数据对应的多个索引;
[0083]在该步骤中,需要进行多表多行的单个数据库修改处理,可参考图3A,进行多表多行的单个数据库修改处理时执行以下的步骤:
[0084]步骤3021,进行一个单表中的一行数据的一个单个数据库修改处理;
[0085]在该步骤3021中,对一个单表中的一行数据的一个单个数据库修改处理与图2所示的实施例中的对一个表的一个行数据的单个数据库修改处理相同,因此,不多赘述。
[0086]如果对所述的一个单表单表中一行数据的单个数据库修改处理失败,则执行:
[0087]步骤3022,结束所述多表多行的数据库修改处理,将数据库恢复到未进行所述多表多行数据库修改处理之前的状态;该步骤也与图2中的步骤202相同,不多赘述。
[0088]如果对所述的一个单表中的一个行数据的单个数据库修改处理成功,则执行:
[0089]步骤3023,进行下一个所述行数据的单个数据库修改处理,直至完成所述多表中全部的行数据的数据库修改处理。
[0090]在该步骤3023中,由于涉及了不同的数据表,则多表多行的单个数据库修改处理应该按照顺序进行,第一个表的第一个行的单个数据库修改处理一直到最后一个表的最后一行的单个数据库修改处理。[0091]步骤303,提交所述写事务处理数据,将所述数据库的全局事务版本号更新为当前最新事务版本号。
[0092]在前述实施例的步骤2021和步骤2031中,用到单表单行的单个数据库修改处理,单表单行的单个数据库修改处理具体包括插入、删除以及更新操作,以下就对这几种不同的单表单行的单个数据库修改进行详细阐述。
[0093]如图4所示,向数据库中的一个表插入一行数据的数据库修改,具体包括:
[0094]步骤401,向所述数据库中插入一行数据,并修改该行数据的版本号为所述最新事务版本号;
[0095]具体的,首先准备好需要向数据库的对应表中插入的数据,以不同的字段的格式例如{X,Y, Z, Q},分别对应一行数据中的四个列,以设定的顺序插入到数据表中。同时,修改该行数据的版本号为在图1的步骤101中生成的全局最新事务版本号。
[0096]此操作新增一行数据,如果插入的行已经存在,或者此行插入后破坏数据库的某个约束,则插入操作失败。
[0097]步骤402,更新所述数据库中插入所述行数据后的多种索引中的每一种索引。
[0098]具体的,在插入数据之后,需要对数据库的索引进行更新操作,从而保证在从数据库中查询数据时,采用的索引能够查询到最近的数据。
[0099]同理,若需要插入多行数据,则可以按照顺序执行重复执行步骤401-402。
[0100]类似的,如图5所示,在数据库的表中删除一行数据的数据库修改,具体包括:
[0101]步骤501,删除所述数据库中的一行数据,并修改该行数据的版本号为所述最新事务版本号;
[0102]具体的,通过此操作删除一个表中的一行数据,如果对应的行不存在或者此操作执行后破坏数据库的设定的约束,则此操作失败;否则,以增量方式标记此操作,修改的版本号是是此次修改的修改版本号,例如n2。这样的操作使得,读事务读到该标记后,将会发现此行数据已经被删除。
[0103]增量方式就是将修改和删除的操作记录和版本号保存到行数据中,而不是立即生效,这样做的目的是能够根据版本号读取行数据,比如某行数据在vl版本上的值为1,在v2版本中被删除,因此在读取这行数据时,使用vl和v2两个不同版本读到的结果分别是I和“行已删除”。
[0104]步骤502,更新所述数据库中删除所述行数据后的多种索引中的每一种索引。
[0105]具体的,在步骤501中已经将相应的一行数据删除,则此需要对数据库的多个索引内容进行封信。完成后把原来的事务版本号修改为新生成的当前最新事务版本号,并提交此事务。后期进行垃圾回收时,会先分别删除此数据的两个或多个索引然后真正删除此数据。
[0106]同样的,若需要删除多行数据,则可以按照顺序执行重复执行步骤501-502。
[0107]此外,如图6所示,对数据库进行单表单行的单个数据库修改操作,还包含更新也就是修改数据表中的行数据的操作,在更新操作中需要修改数据库中行数据的版本号并保留行数据的历史版本,其包括:
[0108]步骤601,更新所述数据库中指定位置的行数据,并修改该行数据的版本号为所述最新事务版本号;[0109]具体的,在所述更新所述数据库中指定位置的行数据,并修改该行数据的版本号为所述最新事务版本号中,如果更新的所述行数据不存在,则结束此次更新操作,并将数据库恢复到未进行所述更新操作之前的状态。
[0110]更新所述数据库中指定位置的行数据的详细过程,可参考图6A,其包括:
[0111]步骤6011,复制所述指定位置的行数据的内容;
[0112]步骤6012,删除所述指定位置的行数据的内容;
[0113]具体的,该步骤可参考图5所示的删除行数据的过程。
[0114]步骤6013,插入修改后的行数据,并修改该行数据的版本号为所述最新事务版本号。
[0115]具体的,步骤6013可参考图4所示的实施例中的步骤401,不多赘述。
[0116]步骤602,更新所述数据库中更新所述行数据后的多种索引中的每一种索引。
[0117]具体的,在对行数据更新之后,需要将数据库的索引也进行更新,同时更改数据库的版本号为最新的全局最新事务版本号,提交此次写事务。当然,如果此次更新的内容不涉及所述多个索引中的一个索引对应的索引列,则不对所述多种索引中的每一种索引更新。
[0118]通过前述的实施例,使得为数据库建立了两种或两种以上的不同种类的索引之后,能够保证在多索引的数据库中,对数据库进行事务处理时,能够保证数据库的ACID特性。
[0119]由于数据库中的数据存在多个版本,那么在采用多索引的查询方式查询数据库中的数据时,就可能查找到不同的版本,为了保证在对数据库进行读事务操作时,能够满足ACID特性,本申请实施例提供了一种多索引数据库事务处理方法,所述方法包括:首先,获取所述数据库的最新事务版本号;之后,根据设定的读取请求方式,采用至少一种索引查询所述数据库中的数据;最后,读取查询到的所述数据库中的数据,并返回具有不晚于所述最新事务版本号的行数据版本号的数据。
[0120]在本申请的较佳实施例中,所述读取查询到的所述数据库中的数据,并返回具有不晚于所述最新事务版本号的行数据版本号的数据具体包括:若查询到的所述数据库中的数据中至少一个的行数据版本号都早于或等于所述最新事务版本号,则返回所述行数据版本号最晚的行数据版本号对应的数据;若查询到的所述数据库中的数据中全部数据的行数据版本号都晚于所述最新事务版本号,则结束所述读事务处理;若没有查询到任何数据,则结束所述读事务处理。
[0121]实施例四
[0122]以下结合附图7,对本申请的实施例四,也就是从数据库中查询书库的事务处理方法进行详细描述。由图7可见,多索引数据库事务处理方法包括:
[0123]步骤701,获取所述数据库的最新事务版本号;
[0124]具体的,在开始读事务之前,需要获取当前最新的“已提交事务ID”,也就是获取最新的数据库全局事务版本号,作为在读取到不同版本号的数据时的取舍参考标准,假设此次获取到的当前已提交事务的最近版本号为N。
[0125]步骤702,根据设定的读取请求方式,采用至少一种索引查询所述数据库中的数据;
[0126]具体而言,由于本申请所述的数据库设置了两种以上的索引,例如顺序索引、散列索引或者位图索引。因此,可以根据最适合的方式,采用其中一种方式进行查询。例如,需要进行范围查询,则可能选择顺序索引作为读取请求方式,采用顺序索引查询数据库中的数据。而若需要进行单项查询,则,可能选择散列索引作为读取请求方式,采用散列索引以随机方式查询数据库中的数据
[0127]步骤703,读取查询到的所述数据库中的数据,并返回具有不晚于所述最新事务版本号的行数据版本号的数据。
[0128]具体的,如果此次查询没有查询到任何数据,则结束此次读事务处理;
[0129]若查询到的所述数据库中的数据中至少一个的行数据版本号都早于或等于所述最新事务版本号,则返回全部版本号都早于或等于所述最新事务版本号的行数据版本号最晚的行数据版本号对应的数据;
[0130]若查询到的所述数据库中的数据中全部数据的行数据版本号都晚于所述最新事务版本号,则结束对此行数据的读取;若没有查询到任何数据,则结束所述读事务处理。
[0131]例如,在步骤701中获取到的最新全局事务版本号为N,如果查询获得的数据只有一个版本,假设是m,如果版本m早于或等于N,那么获得数据有效,否则获得数据无效,请求的数据不存在,处理结束;
[0132]如果获得的数据有多个版本,如果最后的数据版本m2早于或等于N,那么最后版本m2对应的数据即为查询结果,如果最早的版本ml晚于N,那么请求的数据不存在,否则,获得的数据中最后一个早于或等于nl的版本对应的数据即为查询结果,处理结束。
[0133]此外,相应于写事务处理方法,本申请实施例还提供了 一种数据库,这种数据库包含用以生成新的全局有序的最新事务版本号的生成单元;以所述最新事务版本号为标记,对所述数据库进行写事务处理,并更新所述写事务处理后所述数据库中的数据的对应的多个索引的写事务处理单元;以及提交所述写事务处理数据,将所述数据库中的数据的当前事务版本号更新为所述事务版本号更新单元。
[0134]实施例五
[0135]如图8所示,其为本申请实施例提供的数据库的结构图。本申请实施例提供的数据库包括:
[0136]生成单元801,用以生成新的全局有序的最新事务版本号;
[0137]写事务处理单元802,用以以所述最新事务版本号为标记,对所述数据库进行写事务处理,并更新所述写事务处理后所述数据库中的数据的对应的多个索引;
[0138]更新单元803,提交所述写事务处理数据,将所述数据库中的数据的全局事务版本号更新为最新事务版本号。
[0139]其中,写事务处理单元802完成对数据库的写事务处理过程,例如向数据库中插入数据,删除数据库中的数据以及更新数据库中的指定位置的数据等。从写事务处理涉及的数目上区分,还可以划分为包括单个写事务处理和多个写事务处理。其中,单个写事务处理是指对数据进行的一次写事务处理,而多个写事务处理则是指对数据库进行多次写事务处理。
[0140]在单个写事务处理中,又进一步包括对单表单行的单个数据库修改处理和单表多行的单个数据库修改处理以及多表多行的单个数据库修改处理。
[0141]多个写事务处理则包括串行执行的多个写事务处理和并发执行的多个写事务处理。串行的多个写事务处理指按照顺序执行,多个写事务如果并发执行,则按上结合数据库常用的多版本并发控制或者其他类似方法进行。例如通过,行锁和范围锁等方式,实现多个并行执行事务对数据的修改。
[0142]此外,相应于读事务的处理方法,本申请实施例还提供了一种数据库,这种数据库包含用以获取所述数据库的最新事务版本号的获取单元;用以根据设定的读取请求方式,采用至少一种索引查询所述数据库中的数据的查询单元;以及用以读取查询到的所述数据库中的数据,并返回具有不晚于所述全局事务版本号的行数据版本号的数据的读取单元。
[0143]实施例六
[0144]如图9所示,本申请实施例提供一种数据库,包括:
[0145]获取单元901,用以获取所述数据库的最新事务版本号;
[0146]查询单元902,用以根据设定的读取请求方式,采用至少一种索引查询所述数据库中的数据;
[0147]读取单元903,用以读取查询到的所述数据库中的数据,并返回具有不晚于所述最新事务版本号的行数据版本号的数据。
[0148]其中,若查询单元902查询到的所述数据库中的数据中至少一个的行数据版本号都早于或等于获取单元901获取到的事务版本号,则读取单元903返回所述行数据版本号不晚于最新事务版本号的行数据;若查询单元902查询到的所述数据库中的数据中全部数据的行数据版本号都晚于所述获取单元901获取到的所述全局最新事务版本号,则结束对所述行数据的读取;若查询单元902没有查询到任何数据,则结束所述读事务处理。
[0149]需要说明的是,实施例三和实施例四仅仅是针对实施例一和实施例二所提供的方法的模块化设计,所属领域的技术人员应该理解,为了实现双索引数据库,专业人员必然会在数据库中同时设置实施例三和实施例四中的各个功能单元,因此,不应该将实施例三和实施例四中给出的功能单元理解成对本申请的限制。
[0150]专业人员应该还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
[0151]结合本文中所公开的实施例描述的方法或算法的步骤可以用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或【技术领域】内所公知的任意其它形式的存储介质中。
[0152]以上所述的【具体实施方式】,对本申请的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本申请的【具体实施方式】而已,并不用于限定本申请的保护范围,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。
【权利要求】
1.一种多索引数据库事务处理方法,其特征在于,所述数据库包含至少一行数据,所述多索引指向所述行数据中的至少一列数据,所述方法包括: 生成全局有序的最新事务版本号; 以所述最新事务版本号为标记,对所述数据库进行写事务处理,并更新所述写事务处理后所述数据库中的数据对应的多个索引; 提交所述写事务处理数据,将所述数据库的全局事务版本号更新为当前最新事务版本号。
2.如权利要求1所述的多索引数据库事务处理方法,其特征在于,所述写事务处理进一步包括单个写事务处理和多个写事务处理。
3.如权利要求2所述的多索引数据库事务处理方法,其特征在于,所述单个写事务处理进一步包括单表单行的数据库修改和单表多行的数据库修改以及多表多行的数据库修改。
4.如权利要求2所述的多索引数据库事务处理方法,其特征在于,所述的多个写事务处理包括串行执行的多个写事务处理和并发执行的多个写事务处理。
5.如权利要求3所述的多索引数据库事务处理方法,其特征在于,所述单表多行的数据库修改包括: 进行一行数据的单个数据库修改; 如果对所述行数据所述单个数据库修改处理失败,结束所述单表多行的数据库修改处理,将数据库恢复到未进行所述 单表多行的数据库修改之前的状态; 如果对所述行数据的单个数据库修改成功,则进行下一个行数据的单个数据库修改处理,直至完成所述单表中全部的需要修改的行数据的数据库修改。
6.如权利3所述的多索引数据库事务处理方法,其特征在于,所述多表多行的数据库修改包括: 进行一个单表中一行数据的单个数据库修改; 如果对所述行数据的单个数据库修改失败,结束所述多表多行的数据库修改处理,将数据库恢复到未进行所述多表多行的数据库修改处理之前的状态; 如果对所述的行数据的单个数据库修改成功,则进行下一个行数据的单个数据库修改处理,直至完成所述多表中全部的行数据的数据库修改处理。
7.如权利要求3所述的多索引数据库事务处理方法,其特征在于,所述单表单行的数据库修改包括: 向所述数据库中插入一行数据,并修改该行数据的版本号为所述最新事务版本号; 更新所述数据库中插入所述行数据后的多种索引中的每一种索引。
8.如权利要求3所述的多索引数据库事务处理方法,其特征在于,所述单表单行的数据库修改处理包括: 删除所述数据库中的一行数据,并修改该行数据的版本号为所述最新事务版本号; 更新所述数据库中删除所述行数据后的多种索引中的每一种索引。
9.如权利要求3所述的多索引数据库事务处理方法,其特征在于,所述单表单行的数据库修改包括: 更新所述数据库中指定位置的行数据,并修改该行数据的版本号为所述最新事务版本号; 更新所述数据库中更新所述行数据后的多种索引中的每一种索引。
10.如权利要求3所述的多索引数据库事务处理方法,其特征在于,在所述的单表单行的单个数据库修改中, 如果在进行所述单表单行的数据库修改处理后,破坏所述数据库的设定约束,则结束此次数据库写事务,将所述数据库中的数据回滚到执行所述数据库写事务处理前的状态。
11.如权利要求9所述的多索引数据库事务处理方法,其特征在于,所述更新所述数据库中指定位置的行数据,并修改该行数据的版本号为所述最新事务版本号中, 如果更新的所述行数据不存在,则结束此次写事务操作,并将数据库恢复到未进行所述写事务操作之前的状态。
12.如权利要求9所述的多索引数据库事务处理方法,其特征在于,所述更新所述数据库中指定位置的行数据,并修改该行数据的版本号为所述最新事务版本号之后,如果此次更新的内容不涉及所述多个索引中的一个索引对应的索引列,则不对所述多种索引中的每一种索引更新。
13.如权利要求9所述的多索引数据库事务处理方法,其特征在于,所述更新所述数据库中指定位置的行数据,并修改该行数据的版本号为所述最新事务版本号具体包括: 修改数据库中行数据的版本号并保留行数据的历史版本。
14.一种多索引数据库 事务处理方法,其特征在于,所述方法包括: 获取所述数据库的最新事务版本号; 根据设定的读取请求方式,采用至少一种索引查询所述数据库中的数据; 读取查询到的所述数据库中的数据,并返回具有不晚于所述最新事务版本号的行数据版本号的数据。
15.如权利要求14所述的多索引数据库事务处理方法,其特征在于,所述读取查询到的所述数据库中的数据,并返回具有不晚于所述最新事务版本号的行数据版本号的数据具体包括: 若查询到的所述数据库中行包含了早于或等于所述最新事务版本号的数据,则返回所述早于或等于所述最新事务版本号的数据; 若查询到的所述数据库中行数据版本号都晚于所述最新事务版本号,则结束对所述行数据的读取。
16.如权利要求14所述的多索引数据库事务处理方法,其特征在于,所述根据设定的读取请求方式,采用至少一种索引查询所述数据库中的数据之后, 若没有查询到任何数据,则结束所述读事务处理。
17.一种数据库,其特征在于,包括: 生成单元,用以生成新的全局有序的最新事务版本号; 写事务处理单元,用以以所述最新事务版本号为标记,对所述数据库进行写事务处理,并更新所述写事务处理后所述数据库中的数据的对应的多个索引; 更新单元,提交所述写事务处理数据,将所述数据库中的数据的全局事务版本号更新为当前最新事务版本号。
18.一种数据库,其特征在于,包括:获取单元,用以获取所述数据库的最新事务版本号; 查询单元,用以根据设定的读取请求方式,采用至少一种索引查询所述数据库中的数据; 读取单元,用以读取查询到的所述数据库中的数据,并返回具有不晚于所述最新事务版本号的行数据版本号的数据。`
【文档编号】G06F17/30GK103714090SQ201210379819
【公开日】2014年4月9日 申请日期:2012年10月9日 优先权日:2012年10月9日
【发明者】阳振坤, 李凯, 杨传辉, 陈俊全 申请人:阿里巴巴集团控股有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1