具体实施方式
下面结合附图对本发明作进一步详细描述。
在本文中,数据库是指按照数据结构来组织、存储和管理数据的仓库,典型地,其可以为关系数据库。数据库可以运行在单独的设备或共享的设备上。为简明起见,在下文中,如非另有说明,数据库将为关系数据库。本领域技术人员应能理解,其他的数据库类型如同样适用于本发明,也应包含在本发明保护范围以内,并以引用方式包含于此。
一般地,数据库可以通过特定的接口或网络与客户端通信,从而客户端可以向数据库发送操作命令,并且从数据库接收操作命令的执行结果。此处客户端泛指可以与数据库进行上述交互的各种方式,其包括但不限于用户客户端、应用层、分布式数据库系统中用于管理事务的模块等。本领域技术人员应理解,此处,上述所列举的客户端仅为示例性而非限定性描述,存在各种其他的客户端而不背离本发明的精神或范畴,并以引用的方式包含于此。
此外,数据库可以指独立数据库,也可以指分布式数据库系统中的数据库实例。此处,分布式数据库系统指由分布在不同设备上的多个数据库通过网络连接所构成系统,其在逻辑上是统一的整体。
事务是指作为单个逻辑工作单元来执行的一系列操作,其具有原子性,也即事务或是完整地执行,或是完全不执行。通过将一组相关的操作组合成事务,可以确保除非事务中的所有操作都成功完成,并且事务被成功提交,否则该事务所涉及的数据更新(包括增加、删除、更改等)均将被回滚。
在数据库中,为支持多个事务的并发操作,可以为事务定义不同的隔离级别并使用不同的并发机制。其中,多版本并发控制(Multi-Version Concurrency Control,MVCC)维持数据的多个版本,以较小的开销实现并发控制,其允许非阻塞式读,并在写操作时只锁定必要的记录。为简明起见,在本文的实施例中,当涉及事务的并发控制时,将使用MVCC机制。本领域技术人员应理解,其他的事务并发控制方式如同样适用于本发明,也应包含在本发明保护范围以内,并以引用方式包含于此。并且在本文中,数据的历史版本是指存储在数据库中的数据由于被多个事务先后操作所生成的具有先后顺序的各个版本的数据。历史版本号是指由数据库所分配的指示数据的历史版本的编号。当数据库使用MVCC机制时,其可以为MVCC中所使用的数据的版本号。此外,对于某事务TXn,其所对应的历史版本号是指,该历史版本号所指示的该历史版本的数据为已经完成提交(对于分布式数据库系统来说,已经完成全局提交)的事务所引起的,并且对于该事务TXn为最新并且具有一致性的数据。并且,优选地,为每个事务,分布式数据库系统可以确定对于每个数据库实例,该事务所分别对应的历史版本号。从而,对于分布式数据库系统,该事务所对应的历史版本号可以为一个列表,其包括针对各个数据库实例,该事务所对应的各个历史版本号。为简明起见,在下文中,除非另有说明,我们将以对于各个数据库实例,事务所对应的历史版本号相同来进行举例说明。本领域技术人员应理解,对于不同的数据库实例,事务所对应的历史版本号可以不相同。并且,为简明起见,在本文中,除非另有说明,我们将以事务的事务号来指代该事务所对应的历史版本号。此外,本领域技术人员还应理解,历史版本号不仅限于上述MVCC中所使用的数据版本号或事务号,历史版本号可以为任意能够指示数据由于被各个事务所操作所生成历史版本的编号的整数、字符串或其他数据类型或数据结构。
在分布式数据库系统中,事务可以是指针对该分布式数据库系统的全局事务,也可以指仅针对该分布式数据库系统中的某一个数据库的本地事务。对于全局事务,其提交和回滚在所有数据库中必须产生统一的结果,也即或是在所有数据库中均全部提交,或是所有数据库中均全部回滚。在分布式事务处理中,可以采用XA规范来保证分布式数据的一致性。XA规范的基础是两阶段提交协议,其中,在第一阶段,所有数据库进行提交准备。在第二阶段,当收到所有数据库的提交准备就绪的应答后,所有数据库正式提交该事务。并且,当某个数据库提交失败时,所有数据库回滚该事务。
为简明起见,在下文中,当涉及分布式数据库系统的分布式事务处理时,如非另有说明,该分布式事务处理方式将符合XA规范。本领域技术人员应理解,其他的分布式事务处理方式如同样适用于本发明,也应包含在本发明保护范围以内,并以引用方式包含于此。
然而,尽管使用了例如XA规范来保证分布式数据的一致性,但在某些情况下仍然可能出现分布式数据的一致性问题。例如,使用XA规范进行某个全局事务TX1的两阶段提交,假定在第一阶段,所有数据库均做好提交准备并发送了同意提交的应答。接着,在第二阶段,各个数据库,假定为数据库DB1,DB2,和DB3进行正式提交。然而,虽然DB1及DB2提交成功,DB3遭遇问题无法提交成功。此时,由于该分布式数据库系统可能仍在等待DB3对该事务的提交结果,该等待尚未超时,从而尚未发现DB3提交事务TX1时已出现问题。此时,DB1及DB2继续处理正在运行的另一个事务TX2,TX2恰好需要操作被事务TX1所修改的数据。此时,在DB1及DB2中,TX2将读取到TX1的修改。然而,当分布式数据库系统发现DB3未能正常提交TX1时,将在所有数据库上回滚TX1事务,因此,TX2所读取到的由TX1所做的修改实质上为无效的数据,从而导致问题。
由此可知,使用现有技术,分布式数据的一致性仍存在问题。
应注意,上述说明旨在帮助读者理解本发明下文的内容,其并不意在限制本发明目的仅为解决分布式数据的一致性,也并不意在限制本发明所使用的任何具体场景或保护范围。本发明保护范围应由所附权利要求而非上述说明限定。
此外,在本文中,设备包括但不限于网络设备、用户设备、或网络设备与用户设备直接或通过网络相集成所构成的设备。其中,所述网络设备包括但不限于计算机、网络主机、单个网络服务器、多个网络服务器集或多个服务器构成的云;在此,云由基于云计算(Cloud Computing)的大量计算机或网络服务器构成,其中,云计算是分布式计算的一种,由一群松散耦合的计算机集组成的一个虚拟超级计算机。所述网络包括但不限于互联网、广域网、城域网、局域网、VPN网络、无线自组织网络(Ad Hoc网络)等。并且,其中,所述用户设备包括但不限于任何一种可与用户通过键盘、鼠标、遥控器、触摸板、或手写设备等方式进行人机交互的电子产品,例如计算机、手机、PDA、掌上电脑PPC等。本领域技术人员应能理解,其他的设备如同样适用于本发明,也应包含在本发明保护范围以内,并以引用方式包含于此。
图1示出根据本发明一个方面的实施例的在数据库中用于操作数据的方法的流程图。
在下文中,将以数据库DB1中的数据库表employee为例来进行说明。该employee表具有两列“employee_ID”以及“employee_name”,并且为方便理解,我们将指示由各个第一事务所更改数据的版本的各个历史版本号(如上所述,为简明起见,该历史版本号为引起所述更改的事务的事务号)也在下表中列出:
表1
历史版本号 |
employee_ID |
employee_name |
1 |
1 |
张三 |
2 |
1 |
张飞 |
3 |
1 |
张翼德 |
1 |
2 |
李四 |
2 |
2 |
李白 |
3 |
2 |
李太白 |
以下将结合表1进行说明。在步骤S11中,数据库获取正在运行的第一事务中所包含的对于所述数据库的查询操作命令,其中所述查询操作命令包含历史版本号。例如,数据库可以直接或通过网络来从客户端获取客户端所发出的正在运行的第一事务中的查询操作命令。例如,客户端开始第一事务TX1,并发出查询操作命令“select employee_namefrom employee where employee_ID=’1’with version=’2’”。则数据库获取到该正在运行的第一事务TX1所包含的查询操作命令,并且该查询操作命令包含历史版本号,也即“version=’2’”。
接着,数据库根据所述查询操作命令执行所述查询操作,以获取所述数据库中的相关数据的相应的历史版本。接上例,数据库所获取的查询操作命令为“select employee_name from employee where employee_ID=’1’with version=’2’”。从上述表1可知,当employee_ID=1时,当历史版本号为1时,employee_name为“张三”;而当历史版本号为2时,则employee_name为“张飞”;而当历史版本号为3时,则employee_name为“张翼德”。此处,从查询操作命令中可知该查询语句中包含的历史版本号为2,则数据库执行该查询操作并且将获取有关数据的历史版本号为2的版本,从而得到employee_name为“张飞”。
在一个实施例中,数据库基于所述第一事务提交操作命令,执行第一事务提交操作并提供相应的返回结果,所述返回结果中包含该第一事务所对应的历史版本号。
例如,对于运行中的第一事务4(记作TX4),客户端在进行了各个数据库数据操作,例如“update employee where employee_id=1value=’张益德’”之后,客户端发出事务提交操作命令“commit”,则数据库执行事务提交操作以提交TX4。并且,数据库向客户端提供该事务提交操作的返回结果,并且该返回结果中可以包含TX4所对应的历史版本号4。此时,数据库表employee被更新为如下:
表2
历史版本号 |
employee_ID |
employee_name |
1 |
1 |
张三 |
2 |
1 |
张飞 |
3 |
1 |
张翼德 |
4 |
1 |
张益德 |
1 |
2 |
李四 |
2 |
2 |
李白 |
3 |
2 |
李太白 |
再一次,如上所述,历史版本号是指数据的历史版本的编号,在本文中,为简明起见,以事务号作为历史版本号。
本领域技术人员应理解,此处,上述数据库、数据库表、数据库操作命令、历史版本号等仅为示例性而非限定性描述,存在各种其他的实现方式而不背离本发明的精神或范畴,并以引用的方式包含于此。
在一个优选实施例中,所述数据库(记做DB1),包括主数据库(DB1_M)及一个或多个从数据库(DB1_S1,…,DB1_Sn),所述主数据库维护数据的最新版本,并且所述主数据库中的数据可以被同步到所述从数据库中。
在一个实施例中,数据库在完成第一事务提交准备操作后,将所述第一事务的相关信息记入日志。具体地,事务的相关信息可以包括例如第一事务号,第一事务中所包含的语句等信息中的一项或多项。例如,接上例,对于TX1,当DB1完成提交准备操作后,可以将TX1的相关信息记入日志,其包括该第一事务号TX1,该第一事务中所包含的语句,如“update employee where employee_id=1value=’张益德’”。本领域技术人员应理解,此处,对于第一事务的相关信息的描述仅为示例性而非限定性描述,存在各种其他的实现方式而不背离本发明的精神或范畴,并以引用的方式包含于此。
然后,数据库进行提交操作,并且当提交操作未能成功时,例如,主数据库出现故障从而导致提交操作的失败,数据库执行以下任一操作:
-在主数据库上回滚所述第一事务并根据所述日志中所记录的所述第一事务的相关信息执行所述第一事务中所包含的操作并重新提交所述第一事务;
-根据所述日志中所记录的所述第一事务的相关信息在所述一个或多个从数据库中的一个从数据库上执行所述第一事务中所包含的操作重新并提交所述第一事务。
具体地,数据库可以根据例如主数据库从故障中恢复的情况以及耗时,来确定采取上述操作中的哪一种。本领域技术人员应理解,此处,数据库确定采取哪种操作的方式仅为示例性而非限定性描述,存在各种其他的实现方式而不背离本发明的精神或范畴,并以引用的方式包含于此。
例如,当主数据库快速恢复时,则数据库可以在主数据库上回滚该第一事务,并且根据所述日志中所记录的该第一事务的相关信息重新提交该第一事务。在本例中,假定数据库确定需要回滚的第一事务为TX1。从而数据库在主数据库上回滚该第一事务TX1,然后根据所述日记,得到该第一事务TX1中所包含的语句为“update employee whereemployee_id=1value=’张益德’”。随后,数据库在该主数据库上重新执行该语句,并重新提交该TX1。
又如,当主数据库不能快速恢复时,数据库可以从一个或多个从数据库中根据例如预先设定的优先级等选择一个从数据库作为新的主数据库,并根据所述日志中所记录的所述第一事务的相关信息在所述一个或多个从数据库中的一个从数据库上执行所述第一事务中所包含的操作重新并提交所述第一事务。例如,数据库选择一个从数据库DB1_S1作为新的主数据库,并在DB1_S1上执行该TX1所包含的语句“update employee whereemployee_id=1value=’张益德’”,并在DB1_S1上重新提交该TX1。本领域技术人员应理解,此处所描述的在从数据库中选择一个作为新的主数据库的方式仅为示例性而非限定性描述,存在各种其他的实现方式而不背离本发明的精神或范畴,并以引用的方式包含于此。
在又一个优选实施例中,数据库可以根据指定的历史版本号,清理所述数据库中的历史数据。例如,可以指定历史版本号为3,则数据库可以根据该历史版本号,清理数据库中的历史数据,例如,清理版本号不大于3的,并且不是该数据的最新版本的历史数据。对于上述employee表,当指定历史版本号为3,并进行清理完成后,该employee表中的内容为:
表3
历史版本号 |
employee_ID |
employee_name |
4 |
1 |
张益德 |
3 |
2 |
李太白 |
图2示出根据本发明另一个方面的实施例的用于分布式数据库系统(记作DDBS)的事务处理的方法的流程图,其中,所述分布式数据库系统由多个数据库构成,所述数据库支持上文中所述的各种方法中的任意一种或多种。
在下面的说明中,假定该分布式数据库系统(记作DDBS)包括两个数据库实例(记作DB1,DB2),其中DB1中包括表employee,其具有列“employee_ID”以及“employee_name”;DB2中包括表employer,其具有列“employer_ID”,“employee_name”,“employee_ID”。
DB1中的数据库表employee如下:
表4
历史版本号 |
employee_ID |
employee_name |
1 |
1 |
张三 |
2 |
1 |
张飞 |
1 |
2 |
李四 |
2 |
2 |
李白 |
DB2中的数据库表employer如下:
表5
具体地,在步骤S21中,分布式数据库系统获取正在运行的第二事务中所包含的对于所述分布式数据库系统的第一操作命令。所述第二事务指正在运行的该分布式数据库系统中的全局事务。在第二事务运行过程中,客户端可以通过分布式数据库系统的相应的接口发出针对该分布式数据库系统的第一操作命令。分布式数据库系统通过相应的接口可以获取客户端所发出的第一操作命令。例如,在一个实例中,用户3在分布式数据库系统中运行第二事务3(记作TX3),DDBS获取到该正在运行的TX3中所包含的对于该DDBS的第一操作命令为“select employee_name,employer_name from employee,employer whereemployer.employee_id=employee.employee_id”。
接着,在步骤S22中,DDBS根据该DDBS中各个第二事务的相关信息,各个第二事务的操作状态信息,以及各个第二事务所对应的各历史版本号来确定所述第一操作所要使用的历史版本号。
各个第二事务的相关信息可以为例如第二事务号,第二事务中所包含的语句等一项或多项。第二事务的操作状态信息是指对第二事务所进行的操作的状态信息,例如“运行中”,“提交准备完成”,“提交中”,“提交完成”等。第二事务所对应的历史版本号是指由DDBS中的各个数据库为各个第二事务所分配的与该事务相对应的历史版本号。在本文中,为简明起见,以第二事务的事务号作为与其相对应的历史版本号。当第二事务在DDBS中的各个数据库提交后,与该第二事务所对应的该历史版本号可以包含在各个数据库的提交操作结果的返回结果中。应注意,各个数据库所分配/返回的该历史版本号可能互不相同,因此与第二事务所对应的历史版本号可以为一个或多个。为简明起见,在下文中,除非另有说明,对于某个第二事务,各个数据库所分配/所返回的该历史版本号相同,并等于该第二事务号。本领域技术人员应理解,此处所描述的确定第二事务的相关的历史版本号的方式以及历史版本号的表示方式仅为示例性而非限定性描述,存在各种其他的实现方式而不背离本发明的精神或范畴,并以引用的方式包含于此。
DDBS根据各个第二事务的相关信息,可以获取到各个第二事务的事务号。并且DDBS根据各个第二事务的操作状态信息,可以获知该第二事务处于哪种操作运行状态,例如“运行中”,“提交准备完成”,“提交中”,“提交完成”等。并且,DDBS可以通过与各数据库进行交互,或查询所存储的各数据库在事务提交操作的返回结果中所包含的与该事务对应的历史版本号来获取与各个第二事务所对应的各历史版本号。应注意,对于该分布式数据库系统中的各数据库,DDBS将分别获取针对该数据库的,与各个第二事务所对应的各历史版本号。在实现中,一个第二事务TXn可能仅涉及该分布式数据库系统中的某些数据库,则对于该第二事务并未涉及的数据库,例如DBm,该第二事务所对应的历史版本号为假定该第二事务需要访问该DBm,该历史版本号所指示的该历史版本的数据为已经完成全局提交的事务所引起的,并且对于该事务TXn为最新并且具有一致性的数据。
然后,针对该分布式数据库系统中的各个数据库,DDBS将在所述第二事务开始之前已完成全局提交的各个第二事务中的提交时间最晚的第二事务所对应的针对该数据库的历史版本号确定为针对该数据库的,所述第一操作所要使用的历史版本号。并且,应注意,针对各个数据库,所述第一操作所要使用的历史版本号可能不相同。为了简明起见,除非另有说明,我们将以针对各个数据库,所述第一操作所要使用的历史版本号相同来进行说明。本领域技术人员应理解,此处所描述的确定第二事务的相关信息、操作状态信息仅为示例性而非限定性描述,存在各种其他的实现方式而不背离本发明的精神或范畴,并以引用的方式包含于此。
接上例,假定该DDBS中的第二事务包括正在运行的TX3,其第一操作命令为“select employee_name,employer_name from employee,employer whereemployer.employee_id=employee.employee_id”。并且该DDBS中还包括操作状态为“提交完成”的第二事务1(记作TX1),和操作状态为“提交中”的第二事务2(记作TX2)。其中TX1所对应的历史版本号为1,并且TX2所对应的历史版本号为2。并且其中,TX2比TX1提交时间更晚。则在TX3之前已完成提交的各个第二事务中的提交时间最晚的第二事务为TX1,则对于该分布式系统中的各个数据库,DDBMS将该TX1所对应的历史版本号作为针对该数据库的,所述第一操作要使用的历史版本号。此处,为简明起见,假定对于各个数据库,该TX1所对应的历史版本号均为1。
接着,在步骤S23中,DDBS根据上述第一操作命令以及上述历史版本号来生成所述第二事务的一个或多个第二操作命令,所述第二操作命令包含所述历史版本号。
接上例,DDBS将根据上述第一操作命令“select employee_name,employer_namefrom employee,employer where employer.employee_id=employee.employee_id”,以及上述历史版本号“1”来生成一个或多个第二操作命令。例如,DDBS可以将上述命令进行分解,以生成所述第二事务的一个或多个第二操作命令。其中在一个实例中,DDBS可以按照每个第二操作命令仅涉及一个数据库表的原则来生成第二操作命令。例如,其将上述第一操作命令分解为针对employee表的查询的第二操作命令1“select employer_ID,employee_name from employee with version=’1’into employee_temp”,以及针对employer表的查询的第二操作命令2“select employer_ID,employer_name from employer withversion=’1’into employer_temp”,以及针对上述查询结果所产生的新表employee_temp和employer_temp的查询的第二操作命令3“select employee_name,employer name fromemployee_temp,employer_temp where employee_temp.employer_ID=employer_temp.employer_ID”。应注意,虽然在本实例中,第二操作命令1和第二操作命令2中所包含的历史版本号均为1,应理解,如上所述,各个第二操作命令中所包含的历史版本号分别为针对该操作命令所涉及的数据库的该第二事务所对应的历史版本号,其可以互不相同。
接着在步骤S24中,将所述一个或多个第二操作命令发送至该分布式数据库系统中的一个或多个数据库来执行根据上述查询。例如,在一个实现中,可以将该一个或多个第二操作命令发送至该分布式数据库系统中的所有数据库来执行。
在本例中,上述各个第二操作命令在执行完成后将得到如下表所示的查询结果:
表6
employee_name |
employer_name |
张三 |
刘备 |
李四 |
李隆基 |
对于所述第一查询操作命令“select employee_name,employer_name fromemployee,employer where employer.employee_id=employee.employee_id”,按照现有技术的方法所得到的查询结果为,
表7
employee_name |
employer_name |
张飞 |
刘备 |
李白 |
李隆基 |
然而,由于TX2的操作状态为“提交中”,也即其尚未在所有数据库中提交成功。其中,假定该TX2在DB1中已提交成功,其将原数据库表中的记录(employee_ID=1,employee_name=’张三’)更新为(employee_ID=1,employee_name=’张飞’),并将记录(employee_ID=2,employee_name=’李四’)更新为(employee_ID=2,employee_name=’李白’)。但由于该TX2在DB2中尚未提交成功,例如DB2发生了故障,从而不能完成该提交操作。这最终将导致DDBS对该TX2进行回滚,并且其中,上述DB1中的记录更新也将被回滚并不应为其他事务所用。因此,上述按照常规方法所得到的查询结果中的记录(employee_name=’张飞’,employer_name=‘刘备’),以及(employee_name=’李白’,employer_name=‘李隆基’)包含的是错误的数据。而上述按照本发明的方法所得到的查询结果中包含的记录为,(employee_name=’张三’,employer_name=‘刘备’),以及(employee_name=’李四’,employer_name=‘李隆基’),其为正确的数据。
在另一个实例中,假定TX1和TX2的操作状态信息均为“提交成功”。由于TX2所提交的时间晚于TX1,则DDBS将TX2相关的历史版本号“2”确定为该第一操作所要使用的历史版本号。按照上文所述的方法,DDBS生成包含历史版本号“2”的第二操作命令,然后将所述第二操作命令发送至数据库。所述第二操作命令被执行之后,得到如下查询结果,其包含了TX1和TX2所导致的更新。
表8
employee_name |
employer_name |
张飞 |
刘备 |
在一个优选实施例中,可以根据该分布式数据库系统的配置信息来确定其中所述第一操作需要发送至的所述多个数据库中的一个或多个数据库;然后根据上述第一操作命令以及上述历史版本号,并根据上述其中所述第一操作命令需要发送至的所述多个数据库中的一个或多个数据库,生成所述第二事务的一个或多个第二操作命令,所述第二操作命令包含所述历史版本号。
DDBS可以根据其配置信息来确定所述第一操作命令所涉及的一个或多个表所位于的一个或多个数据库,并将其作为所述第一操作命令需要发送至的一个或多个数据库。接上例,DDBS可以得知该第一操作命令所涉及的employee表位于DB1中,employer表位于DB2中,从而确定该第一操作命令需要发送至DB1以及DB2。DDBS并按照每个第二操作命令仅涉及一个数据库中的一个或多个表的原则来生成第二操作命令命令。此时,其所生成的第二操作命令为针对DB1中的employee表的查询的第二操作命令1“select employer_ID,employee_name from employee with version=’1’into employee_temp”,其将被发送至DB1来执行;以及针对DB2中的employer表的查询的第二查询操作命令2“select employer_ID,employer_name from employer with version=’1’into employer_temp”,其将被发送至DB2来执行;以及针对上述查询结果所产生的新表employee_temp和employer_temp的查询的第二查询操作命令3“select employee_name,employer name from employee_temp,employer_temp where employee_temp.employer_ID=employer_temp.employer_ID”,其可以由DDBS的相应模块来执行而不必再发送至任何数据库来执行。
在另一个实例中,当employee表和employer表均位于例如DB1上时,则DDBS确定该第一操作命令需要发送至的数据库为DB1,所生成的第二操作命令可以为“selectemployee_name,employer_name from employee,employer where employer.employee_id=employee.employee_id with version=’2’”,该第二操作命令将被发送至DB1来被执行。
在一个实施例中,DDBS接收所述第二操作命令的返回结果,并且当所述返回结果中包含相应的历史版本号时,记录所述第二事务与所述历史版本号的对应关系。
接上例,DDBS将所述一个或多个第二操作命令发送至一个或多个数据库,例如将“select employer_ID,employee_name from employee with version=’1’intoemployee_temp”发送至DB1来执行,并从DB1接收该命令的返回结果,其为:
表9
employee_ID |
employee_name |
1 |
张三 |
2 |
李四 |
当第二操作命令为事务提交命令时,DDBS从数据库所接收的返回结果中可以包括历史版本号。例如,该TX3的第二操作命令为“commit”并被发送至DB1,从而DDBS可以从DB1接收到该提交命令的返回结果,其中包括的历史版本号为例如“3”。该历史版本号为数据库为该第二事务所分配的一个号码,数据库可以根据该号码获取到执行该第二事务中的操作后所对应的数据库中的数据的版本。
接着,当所述返回结果中包含历史版本号时,DDBS记录所述第二事务与所述历史版本号的对应关系。也即,接上例,DDBS将记录该TX3所对应的历史版本号为3。
再一次,尽管为描述简明起见,在上述描述中以事务号作为历史版本号,历史版本号可以为任意能够指示数据的历史版本的编号的整数、字符串或其他数据类型或数据结构。
在一个实施例中,DDBS对所述第二操作的返回结果进行合并处理,并将合并后的结果发送给客户端。例如,当employee表中的部分数据,例如记录(employee_ID=1,employee_name=’张三’),位于DB1;而另一部分数据,例如(employee_ID=2,employee_name=’李四’),位于DB2时,当第二操作命令为查询操作命令“select employer_ID,employee_name from employee”,其可以被发送至DB1以及DB2来自执行。然后DDBS对DB1和DB2所返回的结果进行合并从而得到如下表所示的结果:
表10
employee_ID |
employee_name |
1 |
张三 |
2 |
李四 |
然后,DDBS将上述合并后的结果返回给客户端。
在一个实施例中,当所述第二操作命令的返回结果中包含历史版本号时,DDBS还可以将所述历史版本号从所述返回结果中去除。例如,当如上文所述,在如“commit”命令的返回结果中包含了历史版本号如“3”时,则将该历史版本号去除,然后再将去除了历史版本号的返回结果提供至客户端。
在又一个实施例中,当第二事务的执行时间超过预定阈值时,DDBS还可以回滚所述第二事务。在一个实施例中,DDBS可以监测第二事务的执行时间,并将其与预定阈值比较。其中该预定阈值可以按照如经验值来进行设置,并可以根据需要来动态调整。当第二事务的执行时间超过预定阈值时,DDBS回滚该第二事务。按照此种方法,DDBS可以回滚由例如死锁等原因所造成的事务,从而解除死锁。
图3示出根据本发明另一个方面的实施例的在数据库设备中用于操作数据的装置的示意图。
在下文中,将以数据库DB1中的数据库表employee为例来进行说明。该employee表具有两列“employee_ID”以及“employee_name”,并且为方便理解,我们将指示由各个第一事务所更改数据的版本的各个历史版本号(如上所述,该历史版本号为引起所述更改的事务的事务号)也在下表中列出:
表1
历史版本号 |
employee_ID |
employee_name |
1 |
1 |
张三 |
2 |
1 |
张飞 |
3 |
1 |
张翼德 |
1 |
2 |
李四 |
2 |
2 |
李白 |
3 |
2 |
李太白 |
以下将结合表1进行说明。首先,用于获取正在运行的第一事务中所包含的对于所述数据库的查询操作命令,其中所述查询操作命令包含历史版本号的装置,以下简称为操作获取装置31,库获取正在运行的第一事务中所包含的对于所述数据库的查询操作命令,其中所述查询操作命令包含历史版本号。例如,操作获取装置31可以直接或通过网络来从客户端获取客户端所发出的正在运行的第一事务中的查询操作命令。例如,客户端开始第一事务TX1,并发出查询操作命令“select employee_name from employee whereemployee_ID=’1’with version=’2’”。则操作获取装置31获取到该正在运行的第一事务TX1所包含的查询操作命令,并且该查询操作命令包含历史版本号,也即“version=’2’”。
接着,用于根据所述查询操作命令执行所述查询操作,以获取所述数据库中的相关数据的相应的历史版本的装置,以下简称为数据获取装置32,根据所述查询操作命令执行所述查询操作,以获取所述数据库中的相关数据的相应的历史版本。接上例,操作获取装置31所获取的查询操作命令为“select employee_name from employee where employee_ID=’1’with version=’2’”。从上述表1可知,当employee_ID=1时,并且历史版本号为1时,employee_name为“张三”;而当历史版本号为2时,则employee_name为“张飞”;而当历史版本号为3时,则employee_name为“张翼德”。此处,从查询操作命令中可知该查询语句中包含的历史版本号为2,则数据获取装置32执行该查询操作并且将获取有关数据的历史版本号为2的版本,从而得到employee_name为“张飞”。
在一个实施例中,用于基于所述第一事务提交操作命令,执行第一事务提交操作并提供相应的返回结果,所述返回结果中包含该第一事务所对应的历史版本号的装置,以下简称结果返回装置33(未示出),基于所述第一事务提交操作命令,执行第一事务提交操作并提供相应的返回结果,所述返回结果中包含该第一事务所对应的历史版本号。
例如,对于运行中的第一事务4(记作TX4),客户端在进行了各个数据库数据操作,例如“update employee where employee_id=1value=’张益德’”之后,客户端发出事务提交操作命令“commit”,则数据库执行事务提交操作以提交TX4。并且,结果返回装置33向客户端提供该事务提交操作的返回结果,并且该返回结果中可以包含TX4所对应的历史版本号4。此时,数据库表employee被更新为如下:
表2
历史版本号 |
employee_ID |
employee_name |
1 |
1 |
张三 |
2 |
1 |
张飞 |
3 |
1 |
张翼德 |
4 |
1 |
张益德 |
1 |
2 |
李四 |
2 |
2 |
李白 |
3 |
2 |
李太白 |
再一次,如上所述,历史版本号是指数据的历史版本的编号,在本文中,为简明起见,以事务号作为历史版本号。
本领域技术人员应理解,此处,上述数据库、数据库表、数据库操作命令、历史版本号等仅为示例性而非限定性描述,存在各种其他的实现方式而不背离本发明的精神或范畴,并以引用的方式包含于此。
在一个优选实施例中,所述数据库(记做DB1),包括主数据库(DB1_M)及一个或多个从数据库(DB1_S1,…,DB1_Sn),所述主数据库维护数据的最新版本,并且所述主数据库中的数据可以被同步到所述从数据库中。
在一个实施例中,用于在完成第一事务提交准备操作后,将所述第一事务的相关信息记入日志的装置,以下简称日志记录装置34(未示出),在数据库完成第一事务提交准备操作后,将所述第一事务的相关信息记入日志。具体地,事务的相关信息可以包括例如第一事务号,第一事务中所包含的语句等信息中的一项或多项。例如,接上例,对于TX1,当DB1完成提交准备操作后,日志记录装置34可以将TX1的相关信息记入日志,其包括该第一事务号TX1,该第一事务中所包含的语句,如“update employee where employee_id=1value=’张益德’”。本领域技术人员应理解,此处,对于第一事务的相关信息的描述仅为示例性而非限定性描述,存在各种其他的实现方式而不背离本发明的精神或范畴,并以引用的方式包含于此。
然后,数据库进行提交操作,并且当提交操作未能成功时,例如,主数据库出现故障从而导致提交操作的失败,用于对于应提交但主数据库未能完成提交操作的第一事务,执行以下任一操作的装置,以下简称事务恢复装置35(未示出),执行以下任一操作:
-在主数据库上回滚所述第一事务并根据所述日志中所记录的所述第一事务的相关信息执行所述第一事务中所包含的操作并重新提交所述第一事务;
-根据所述日志中所记录的所述第一事务的相关信息在所述一个或多个从数据库中的一个从数据库上执行所述第一事务中所包含的操作重新并提交所述第一事务。
具体地,事务恢复装置35可以根据例如主数据库从故障中恢复的情况以及耗时,来确定采取上述操作中的哪一种。本领域技术人员应理解,此处,事务恢复装置35确定采取哪种操作的方式仅为示例性而非限定性描述,存在各种其他的实现方式而不背离本发明的精神或范畴,并以引用的方式包含于此。
例如,当主数据库快速恢复时,则事务恢复装置35可以在主数据库上回滚该第一事务,并且根据所述日志中所记录的该第一事务的相关信息重新提交该第一事务。在本例中,假定事务恢复装置35确定需要回滚的第一事务为TX1。从而事务恢复装置35在主数据库上回滚该第一事务TX1,然后根据所述日记,得到该第一事务TX1中所包含的语句为“updateemployee where employee_id=1value=’张益德’”。随后,事务恢复装置35在该主数据库上重新执行该语句,并重新提交该TX1。
又如,当主数据库不能快速恢复时,事务恢复装置35可以从一个或多个从数据库中根据例如预先设定的优先级等选择一个从数据库作为新的主数据库,并根据所述日志中所记录的所述第一事务的相关信息在所述一个或多个从数据库中的一个从数据库上执行所述第一事务中所包含的操作重新并提交所述第一事务。例如,事务恢复装置35选择一个从数据库DB1_S1作为新的主数据库,并在DB1_S1上执行该TX1所包含的语句“updateemployee where employee_id=1value=’张益德’”,并在DB1_S1上重新提交该TX1。本领域技术人员应理解,此处所描述的在从数据库中选择一个作为新的主数据库的方式仅为示例性而非限定性描述,存在各种其他的实现方式而不背离本发明的精神或范畴,并以引用的方式包含于此。
在又一个优选实施例中,用于根据指定的历史版本号,清理所述数据库中的与所述第一事务有关的历史数据的装置,以下简称历史数据清理装置36(未示出),可以根据指定的历史版本号,清理所述数据库中的历史数据。例如,可以指定历史版本号为3,则历史数据清理装置36可以根据该历史版本号,清理数据库中的历史数据,例如,清理版本号不大于3的,并且不是该数据的最新版本的历史数据。对于上述employee表,当指定历史版本号为3,并进行清理完成后,该employee表中的内容为:
表3
历史版本号 |
employee_ID |
employee_name |
4 |
1 |
张益德 |
3 |
2 |
李太白 |
图4示出根据本发明另一个方面的在分布式数据库系统(记作DDBS)中管理事务的装置示意图,其中,所述分布式数据库系统由多个数据库构成,所述数据库适于执行上文中所述的各种数据操作方法中的任意一种或多种。
在下面的说明中,假定该分布式数据库系统(记作DDBS)包括两个数据库实例(记作DB1,DB2),其中DB1中包括表employee,其具有列“employee_ID”以及“employee_name”;DB2中包括表employer,其具有列“employer_ID”,“employee_name”,“employee_ID”。
DB1中的数据库表employee如下:
表4
历史版本号 |
employee_ID |
employee_name |
1 |
1 |
张三 |
2 |
1 |
张飞 |
1 |
2 |
李四 |
2 |
2 |
李白 |
DB2中的数据库表employer如下:
表5
具体地,用于获取正在运行的第二事务中所包含的对于所述分布式数据库系统的第一操作命令的装置,以下简称为第一操作命令获取装置41,获取正在运行的第二事务中所包含的对于所述分布式数据库系统的第一操作命令。所述第二事务指正在运行的该分布式数据库系统中的全局事务。在第二事务运行过程中,客户端可以通过分布式数据库系统的相应的接口发出针对该分布式数据库系统的第一操作命令。第一操作命令获取装置41通过相应的接口可以获取客户端所发出的第一操作命令。例如,在一个实例中,用户3在分布式数据库系统中运行第二事务3(记作TX3),第一操作命令获取装置41获取到该正在运行的TX3中所包含的对于该DDBS的第一操作命令为“select employee_name,employer_namefrom employee,employer where employer.employee_id=employee.employee_id”。
接着,用于根据该分布式数据库系统中各个第二事务的相关信息,各个第二事务的操作状态信息,以及各个第二事务所对应的各历史版本号来确定所述第一操作所要使用的历史版本号的装置,以下简称为历史版本号获取装置42,根据该DDBS中各个第二事务的相关信息,各个第二事务的操作状态信息,以及各个第二事务所对应的各历史版本号来确定所述第一操作所要使用的历史版本号。
各个第二事务的相关信息可以为例如第二事务号,第二事务中所包含的语句等一项或多项。第二事务的操作状态信息是指对第二事务所进行的操作的状态信息,例如“运行中”,“提交准备完成”,“提交中”,“提交完成”等。第二事务所对应的历史版本号是指由DDBS中的各个数据库为各个第二事务所分配的与该事务相对应的历史版本号。在本文中,为简明起见,以第二事务的事务号作为与其相对应的历史版本号。当第二事务在DDBS中的各个数据库提交后,与该第二事务所对应的该历史版本号可以包含在各个数据库的提交操作结果的返回结果中。应注意,各个数据库所分配/返回的该历史版本号可能互不相同,因此与第二事务所对应的历史版本号可以为一个或多个。为简明起见,在下文中,除非另有说明,对于某个第二事务,各个数据库所分配/所返回的该历史版本号相同,并等于该第二事务号。本领域技术人员应理解,此处所描述的确定第二事务的相关的历史版本号的方式以及历史版本号的表示方式仅为示例性而非限定性描述,存在各种其他的实现方式而不背离本发明的精神或范畴,并以引用的方式包含于此。
历史版本号获取装置42根据各个第二事务的相关信息,可以获取到各个第二事务的事务号。并且历史版本号获取装置42根据各个第二事务的操作状态信息,可以获知该第二事务处于哪种操作运行状态,例如“运行中”,“提交准备完成”,“提交中”,“提交完成”等。并且,历史版本号获取装置42可以通过与各数据库进行交互,或查询所存储的各数据库在事务提交操作的返回结果中所包含的与该事务对应的历史版本号来获取与各个第二事务所对应的各历史版本号。应注意,对于该分布式数据库系统中的各数据库,历史版本号获取装置42将分别获取针对该数据库的,与各个第二事务所对应的各历史版本号。在实现中,一个第二事务TXn可能仅涉及该分布式数据库系统中的某些数据库,则对于该第二事务并未涉及的数据库,例如DBm,该第二事务所对应的历史版本号为假定该第二事务需要访问该DBm,该历史版本号所指示的该历史版本的数据为已经完成全局提交的事务所引起的,并且对于该事务TXn为最新并且具有一致性的数据。
然后,针对该分布式数据库系统中的各个数据库,历史版本号获取装置42将在所述第二事务开始之前已完成全局提交的各个第二事务中的提交时间最晚的第二事务所对应的针对该数据库的历史版本号确定为针对该数据库的,所述第一操作所要使用的历史版本号。并且,应注意,针对各个数据库,所述第一操作所要使用的历史版本号可能不相同。为了简明起见,除非另有说明,我们将以针对各个数据库,所述第一操作所要使用的历史版本号相同来进行说明。本领域技术人员应理解,此处所描述的确定第二事务的相关信息、操作状态信息仅为示例性而非限定性描述,存在各种其他的实现方式而不背离本发明的精神或范畴,并以引用的方式包含于此。
接上例,假定该DDBS中的第二事务包括正在运行的TX3,其第一操作命令为“select employee_name,employer_name from employee,employer whereemployer.employee_id=employee.employee_id”。并且该DDBS中还包括操作状态为“提交完成”的第二事务1(记作TX1),和操作状态为“提交中”的第二事务2(记作TX2)。其中TX1所对应的历史版本号为1,并且TX2所对应的历史版本号为2。并且其中,TX2比TX1提交时间更晚。则在TX3之前已完成提交的各个第二事务中的提交时间最晚的第二事务为TX1,则对于该分布式系统中的各个数据库,历史版本号获取装置42将该TX1所对应的历史版本号作为针对该数据库的,所述第一操作要使用的历史版本号。此处,为简明起见,假定对于各个数据库,该TX1所对应的历史版本号均为1。。
接着,用于根据上述第一操作命令以及上述历史版本号来生成所述第二事务的一个或多个第二操作命令,所述第二操作命令包含所述历史版本号的装置,以下简称为第二操作命令生成装置43,根据上述第一操作命令以及上述历史版本号来生成所述第二事务的一个或多个第二操作命令,所述第二操作命令包含所述历史版本号。
接上例,第二操作命令生成装置43将根据上述第一操作命令“select employee_name,employer_name from employee,employer where employer.employee_id=employee.employee_id”,以及上述历史版本号“1”来生成一个或多个第二操作命令。例如,第二操作命令生成装置43可以将上述命令进行分解,以生成所述第二事务的一个或多个第二操作命令。其中在一个实例中,第二操作命令生成装置43可以按照每个第二操作命令仅涉及一个数据库表的原则来生成第二操作命令。例如,其将上述第一操作命令分解为针对employee表的查询的第二操作命令1“select employer_ID,employee_name fromemployee with version=’1’into employee_temp”,以及针对employer表的查询的第二操作命令2“select employer_ID,employer_name from employer with version=’1’into employer_temp”,以及针对上述查询结果所产生的新表employee_temp和employer_temp的查询的第二操作命令3“select employee_name,employer name from employee_temp,employer_temp where employee_temp.employer_ID=employer_temp.employer_ID”。应注意,虽然在本实例中,第二操作命令1和第二操作命令2中所包含的历史版本号均为1,应理解,如上所述,各个第二操作命令中所包含的历史版本号分别为针对该操作命令所涉及的数据库的该第二事务所对应的历史版本号,其可以互不相同。
接着用于将所述一个或多个第二操作命令发送至该分布式数据库系统中的一个或多个数据库来执行的装置,以下简称操作命令发送装置44,将所述一个或多个第二操作命令发送至该分布式数据库系统中的一个或多个数据库来执行根据上述查询。例如,在一个实现中,操作命令发送装置44可以将该一个或多个第二操作命令发送至该分布式数据库系统中的所有数据库来执行。
在本例中,上述各个第二操作命令在执行完成后将得到如下表所示的查询结果:
表6
employee_name |
employer_name |
张三 |
刘备 |
李四 |
李隆基 |
对于所述第一查询操作命令“select employee_name,employer_name fromemployee,employer where employer.employee_id=employee.employee_id”,按照现有技术的方法所得到的查询结果为,
表7
employee_name |
employer_name |
张飞 |
刘备 |
李白 |
李隆基 |
然而,由于TX2的操作状态为“提交中”,也即其尚未在所有数据库中提交成功。其中,假定该TX2在DB1中已提交成功,其将原数据库表中的记录(employee_ID=1,employee_name=’张三’)更新为(employee_ID=1,employee_name=’张飞’),并将记录(employee_ID=2,employee_name=’李四’)更新为(employee_ID=2,employee_name=’李白’)。但由于该TX2在DB2中尚未提交成功,例如DB2发生了故障,从而不能完成该提交操作。这最终将导致DDBS对该TX2进行回滚,并且其中,上述DB1中的记录更新也将被回滚并不应为其他事务所用。因此,上述按照常规方法所得到的查询结果中的记录(employee_name=’张飞’,employer_name=‘刘备’),以及(employee_name=’李白’,employer_name=‘李隆基’)包含的是错误的数据。而上述按照本发明的方法所得到的查询结果中包含的记录为,(employee_name=’张三’,employer_name=‘刘备’),以及(employee_name=’李四’,employer_name=‘李隆基’),其为正确的数据。
在另一个实例中,假定TX1和TX2的操作状态信息均为“提交成功”。由于TX2所提交的时间晚于TX1,则历史版本号获取装置42将TX2相关的历史版本号“2”确定为该第一操作所要使用的历史版本号。按照上文所述的方法,第二操作命令生成装置43生成包含历史版本号“2”的第二操作命令,然后操作命令发送装置44将所述第二操作命令发送至数据库,所述第二操作命令执行之后,得到如下查询结果,其包含了TX1和TX2所导致的更新。
表8
employee_name |
employer_name |
张飞 |
刘备 |
李白 |
李隆基 |
在一个优选实施例中,用于根据该分布式数据库系统的配置信息来确定其中所述第一操作需要发送至的所述多个数据库中的一个或多个数据库的装置,以下简称数据库确定装置431(未示出),可以根据该分布式数据库系统的配置信息来确定其中所述第一操作需要发送至的所述多个数据库中的一个或多个数据库;然后用于根据上述第一操作命令以及上述历史版本号,并根据上述其中所述第一操作需要发送至的所述多个数据库中的一个或多个数据库,生成所述第二事务的一个或多个第二操作命令,所述第二操作命令包含所述历史版本号的装置,以下简称第二操作命令第二生成装置432(未示出)根据上述第一操作命令以及上述历史版本号,并根据上述其中所述第一操作命令需要发送至的所述多个数据库中的一个或多个数据库,生成所述第二事务的一个或多个第二操作命令,所述第二操作命令包含所述历史版本号。
数据库确定装置431可以根据其配置信息来确定所述第一操作命令所涉及的一个或多个表所位于的一个或多个数据库,并将其作为所述第一操作命令需要发送至的一个或多个数据库。接上例,数据库确定装置431可以得知该第一操作命令所涉及的employee表位于DB1中,employer表位于DB2中,从而确定该第一操作命令需要发送至DB1以及DB2。第二操作命令第二生成装置432按照每个第二操作命令仅涉及一个数据库中的一个或多个表的原则来生成第二操作命令。此时,其所生成的第二操作命令为针对DB1中的employee表的查询的第二操作命令1“select employer_ID,employee_name from employee with version=’1’into employee_temp”,其将被操作命令发送装置44发送至DB1来执行;以及针对DB2中的employer表的查询的第二查询操作命令2“select employer_ID,employer_name fromemployer with version=’1’into employer_temp”,其将被操作命令发送装置44发送至DB2来执行;以及针对上述查询结果所产生的新表employee_temp和employer_temp的查询的第二查询操作命令3“select employee_name,employer name from employee_temp,employer_temp where employee_temp.employer_ID=employer_temp.employer_ID”,其可以由DDBS的相应模块来执行而不必再发送至任何数据库来执行。
在另一个实例中,当employee表和employer表均位于例如DB1上时,则数据库确定装置431确定该第一操作命令需要发送至的数据库为DB1,第二操作命令第二生成装置432所生成的第二操作命令可以为“select employee_name,employer_name from employee,employer where employer.employee_id=employee.employee_id with version=’2’”,该第二操作命令将被操作命令发送装置44发送至DB1来被执行。
在一个实施例中,用于接收所述第二操作命令的返回结果的装置,以下简称结果接收装置45(未示出),接收所述第二操作命令的返回结果,并且用于当所述返回结果中包含历史版本号时,记录所述第二事务与所述历史版本号的对应关系的装置,以下简称历史版本号记录装置46(未示出),当所述返回结果中包含相应的历史版本号时,记录所述第二事务与所述历史版本号的对应关系。
接上例,操作命令发送装置44将所述一个或多个第二操作命令发送至一个或多个数据库,例如将“select employer_ID,employee_name from employee with version=’1’into employee_temp”发送至DB1来执行,并且结果接收装置45从DB1接收该命令的返回结果,其为:
表9
employee_ID |
employee_name |
1 |
张三 |
2 |
李四 |
当第二操作命令为事务提交命令时,结果接收装置45从数据库所接收的返回结果中可以包括历史版本号。例如,该TX3的第二操作命令为“commit”并被发送至DB1,从而结果接收装置45可以从DB1接收到该提交命令的返回结果,其中包括的历史版本号为例如“3”。该历史版本号为数据库为该第二事务所分配的一个号码,数据库可以根据该号码获取到执行该第二事务中的操作后所对应的数据库中的数据的版本。
接着,当所述返回结果中包含历史版本号时,历史版本号记录装置46记录所述第二事务与所述历史版本号的对应关系。也即,接上例,历史版本号记录装置46将记录该TX3所对应的历史版本号为3。
再一次,尽管为描述简明起见,在上述描述中以事务号作为历史版本号,历史版本号可以为任意能够指示数据的历史版本的编号的整数、字符串或其他数据类型或数据结构。
在一个实施例中,用于对所述第二操作的返回结果进行合并处理的装置,以下简称结果合并装置47(未示出),对所述第二操作的返回结果进行合并处理,并且用于将合并后的结果发送给客户端的装置,以下简称结果发送装置48(未示出)将合并后的结果发送给客户端。例如,当employee表中的部分数据,例如记录(employee_ID=1,employee_name=’张三’),位于DB1;而另一部分数据,例如(employee_ID=2,employee_name=’李四’),位于DB2时,当第二操作命令为查询操作命令“select employer_ID,employee_name fromemployee”,其可以被操作命令发送装置44发送至DB1以及DB2来自执行。然后结果合并装置47对DB1和DB2所返回的结果进行合并从而得到如下表所示的结果:
表10
employee_ID |
employee_name |
1 |
张三 |
2 |
李四 |
然后,结果发送装置48将上述合并后的结果返回给客户端。
在一个实施例中,当所述第二操作命令的返回结果中包含历史版本号时,结果合并装置47还可以将所述历史版本号从所述返回结果中去除。例如,当如上文所述,在如“commit”命令的返回结果中包含了历史版本号如“3”时,则结果合并装置47将该历史版本号去除,然后结果发送装置48再将去除了历史版本号的返回结果提供至客户端。
在又一个实施例中,当第二事务的执行时间超过预定阈值时,用于当第二事务的执行时间超过预定阈值时,回滚所述第二事务的装置,以下简称事务回滚装置49(未示出),还可以回滚所述第二事务。在一个实施例中,事务回滚装置49可以监测第二事务的执行时间,并将其与预定阈值比较。其中该预定阈值可以按照如经验值来进行设置,并可以根据需要来动态调整。当第二事务的执行时间超过预定阈值时,事务回滚装置49回滚该第二事务。按照此种方法,事务回滚装置49可以回滚由例如死锁等原因所造成的事务,从而解除死锁。
图5示出根据本发明又一个方面的分布式数据库系统的示意图,其包括包含多个本发明的一个上述方面的在数据库设备中用于操作数据的装置的数据库设备,以及包含本发明的一个上述方面所述的在分布式数据库系统中用于管理事务的装置的设备。
此外,在一个实施例中,所述分布式数据库系统还可以包括日志存储系统(未示出),其用于存储所述分布式存储和操作系统中各事务的相关信息以及操作状态信息。
需要注意的是,本发明可在软件和/或软件与硬件的组合体中被实施,例如,可采用专用集成电路(ASIC)、通用目的计算机或任何其他类似硬件设备来实现。在一个实施例中,本发明的软件程序可以通过处理器执行以实现上文所述步骤或功能。同样地,本发明的软件程序(包括相关的数据结构)可以被存储到计算机可读记录介质中,例如,RAM存储器,磁或光驱动器或软磁盘及类似设备。另外,本发明的一些步骤或功能可采用硬件来实现,例如,作为与处理器配合从而执行各个步骤或功能的电路。
另外,本发明的一部分可被应用为计算机程序产品,例如计算机程序指令,当其被计算机执行时,通过该计算机的操作,可以调用或提供根据本发明的方法和/或技术方案。而调用本发明的方法的程序指令,可能被存储在固定的或可移动的记录介质中,和/或通过广播或其他信号承载媒体中的数据流而被传输,和/或被存储在根据所述程序指令运行的计算机设备的工作存储器中。在此,根据本发明的一个实施例包括一个装置,该装置包括用于存储计算机程序指令的存储器和用于执行程序指令的处理器,其中,当该计算机程序指令被该处理器执行时,触发该装置运行基于前述根据本发明的多个实施例的方法和/或技术方案。
对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化涵括在本发明内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。此外,显然“包括”一词不排除其他单元或步骤,单数不排除复数。装置权利要求中陈述的多个装置也可以由一个装置通过软件或者硬件来实现。第一,第二等词语用来表示名称,而并不表示任何特定的顺序。