本发明涉及数据库技术领域,尤其涉及一种事务之间的时序确定方法和装置。
背景技术:
快照隔离(Snapshot Isolation,简称SI)是真实系统中普遍使用的并发控制策略,很多主流数据库产品(例如Oracle,SQL Server,PostgreSQL)均采用SI作为并发控制机制。传统的SI方法使用中心时钟分配的时间戳来确定事务在时间上的先后关系,并以此来探测可能破坏数据一致性的冲突操作。由于SI仅使用一个中心时钟分配时间戳,因此,其需要一个中心协调节点对其进行调节,限制了并行度较高的计算平台的扩展,降低了整个系统的扩展性和容错能力。
相关技术中,为了降低中心时钟对系统的影响,提出了一种分布式快照隔离(Distributed Snapshot Isolation,简称DSI)机制,并提出了四种不同的实施方案,其中的“乐观协调方法”使计算机集群中的每一个节点都维护一个用来分配时间戳的本地时钟,这样本地的单节点事务只从本地时钟获取时间戳,但全局的多节点事务必须预先锁定所有涉及该事务的节点,并从每一个节点获取一个时间戳,且每一个事务需要预先知道它要访问的所有节点。
因此,虽然上述分布式快照隔离机制的“乐观协调方法”不需要中心节点进行协调,但却要求每个事务事先知道其要访问的所有节点,这对于实时事务来说基本是不可能实现的,而且,全局的多节点事务需要预先锁定该事务涉及的所有节点,初始化代价大,成本高。
技术实现要素:
本发明提供一种事务之间的时序确定方法和装置,用于解决现有快照隔离方法扩展性和可靠性差、成本高的问题。
本发明提供一种事务之间的时序确定方法,包括:
获取事务A和事务B之间的数据依赖关系;
根据所述数据依赖关系,确定所述事务A和所述事务B之间的数据可见性,其中,所述数据可见性用于指示对方事务的已提交数据是否可见;
根据所述数据可见性,确定所述事务A和所述事务B的发生时序。
本发明还提供一种事务之间的时序确定装置,包括:
依赖关系获取模块,用于获取事务A和事务B之间的数据依赖关系;
可见性确定模块,用于根据所述依赖关系获取模块获取到的所述数据依赖关系,确定所述事务A和所述事务B之间的数据可见性,其中,所述数据可见性用于指示对方事务的已提交数据是否可见;
时序确定模块,用于根据所述可见性确定模块确定的所述数据可见性,确定所述事务A和所述事务B的发生时序。
本发明提供的事务之间的时序确定方法和装置,通过获取事务A和事务B之间的数据依赖关系,进而根据该数据依赖关系,确定事务A和事务B之间的数据可见性,即利用数据可见性指示对方事务的已提交数据是否可见,最后根据数据可见性,确定出事务A和事务B的发生时序。本发明的技术方案,利用事务之间的可见性来确定事务的逻辑时间戳,也即,事务通过与其他事务协商来确定自己的逻辑时间区间,进而利用逻辑时间戳来确定事务之间的时序关系,避免了从中心化的时钟获取时间戳,消除了中心协调节点存在的必要性,提高了分布式数据库系统的扩展性和可靠性。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明提供的事务之间的时序确定方法实施例一的流程示意图;
图2为本发明提供的事务之间的时序确定方法实施例二的流程示意图;
图3为本发明提供的事务之间的时序确定方法实施例三的流程示意图;
图4为本发明提供的事务之间的时序确定方法实施例四的流程示意图;
图5为本发明提供的事务之间的时序确定方法实施例五的流程示意图;
图6为本发明提供的事务之间的时序确定装置实施例一的结构示意图;
图7为本发明提供的事务之间的时序确定装置实施例二的结构示意图;
图8为本发明提供的事务之间的时序确定装置实施例三的结构示意图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
随着当今计算平台的并行度在不断地提高,拥有数百个核的服务器在可预见的未来会变得非常普遍,因此,为了应对这种发展趋势,众多研究项目旨在缔造能够适应高并行平台的数据库系统。另外,随着数据规模的快速增长,大规模集群的横向扩展能力被认为是当今数据库系统的一项最重要的能力,众多并行数据库系统(包括NoSQL、NewSQL数据库)都是围绕扩展性能力而设计的。在高度并行化的平台中,由于中心协调节点有可能严重降低整个系统的扩展性和容错能力,因此,为了提高系统的扩展性,很有必要将中心协调节点去掉。
在实际应用中,为了降低中心时钟对系统的影响,在前面提到的分布式快照隔离(DSI)机制中,还有一种“增量快照方法”,具体的,某一事务在一个节点上启动时,只需要从本地时钟获得时间戳,而当该事务尝试访问某个远程节点上的数据时,才需要从该远程节点上获取一个合适的时间戳。在该方法中,为了确保远程时间戳的有效性,系统需要维护一个从本地时钟到全局时钟的映射,此时,每一个节点都需要和中心协调节点进行交互来保证该映射的正确性。虽然“增量快照方法”不需要预先知道事务将要访问的节点,但是需要维护更新从本地时钟到全局时钟的映射,每个节点都需要以一定频率和中心协调节点进行通信,因此,在该方法中,中心协调节点还是不可缺少的,使得系统的扩展性受到限制,当中心协调节点失效时,将导致系统瘫痪。
进一步的,为了降低中心时钟对系统的影响,还可使用同步物理时钟来实现事务之间的并发机制,具体的,使用同步物理时钟来分配快照和提交时间戳,事务的快照时间戳从事务启动节点上的时钟获取,对于更新事务的提交时间戳,若为单节点更新事务,则提交时间戳直接从更新数据所在节点上的时钟获取,若为多节点更新事务,则通过多节点时钟的协商来确定事务的提交时间戳。在该方法中,时钟的同步可能导致时间上的偏移,进而导致事务的快照时间戳对应的数据快照不可用,这时事务的操作就必须阻塞直到该数据快照可用为止。为了处理这种偏移,同步物理时钟会给事务分配一个比较靠前的快照时间戳,以此来减少事务阻塞的可能性,但这种方案比较复杂,并且因为时间偏移可能导致严重的性能损失。
针对上述技术问题,本发明提出了一种事务之间的时序确定方法和装置,用于解决现有快照隔离方法扩展性和可靠性差、成本高的问题。下面,通过具体实施例对本申请所示的技术方案进行详细说明。
需要说明的是,下面这几个具体的实施例可以相互结合,对于相同或相似的概念或过程可能在某些实施例中不再赘述。为了便于理解,下面先对各个实施例可能所涉及到的基本概念进行定义和说明。
1、可见性
假设ti和tj为两个不同的事务,则ti对于tj是可见的(用ti→tj表示),当且仅当ti写的全部数据对于tj都是可见的;ti对于tj是不可见的(用表示),当且仅当ti写的全部数据对于tj都是不可见的。
值得说明的是,可见性的定义中,事务写的数据均指已提交的数据,对于未提交的数据只在事务内部可见,在事务外部是不可见的。
因此,基于可见性的定义可知,事务t可见的数据快照由两部分组成:事务t开始前已提交的数据版本和对于事务t可见的全部事务写的数据版本,因此,一旦事务之间的可见性关系(决定事务的提交顺序)确定,就可以推出每个事务可见的数据快照(决定事务可见的数据版本),进而就可以确定整个事务集合的调度顺序。
2、可见性调度
假设给定一个事务的集合T={t0,t1,t2,….,tn},那么T的一个可见性调度可以是这样一个映射S:T×T→{可见,不可见},对于任何两个事务ti、tj∈T(i≠j),或者ti→tj,或者
可见性调度是在每两个事务之间确定的一种可见性关系(可见性是一个二元关系),然而并不是任意的可见性调度都是可执行的。举例来说,如果两个事务相互之间是可见的,则这个事务集合就不可能存在一个可执行的调度顺序。因此一个可见性调度必须要满足其他的一些约束条件才能是实际可执行的,下面将对其进行说明。
一个事务集合的实际调度是由事务的读/写操作相互交错而产生的一个操作序列,在这个操作序列中能够产生三种可能的数据依赖关系:
1)写-读依赖关系:如果ti在tj读数据A之前写了数据A并且提交,则ti与tj之间存在写-读依赖关系,用表示。
2)读-写依赖关系:如果ti在tj写数据A之前读了数据A,则ti与tj之间存在读-写依赖关系,用表示。
3)写-写依赖关系:如果ti在tj写数据A之前写了数据A并且提交,则ti与tj之间存在写-写依赖关系,用表示。
因此,从这些数据依赖关系可以推断出事务之间的可见性关系,举例来说,如果则可以推断出是不可能的,因为tj读了ti写的数据;如果则可以推断出tj→ti是不可能的。对于可见性调度S,如果存在一个实际调度X,使得从X推断出的事务可见性关系与S是一致的,则S是实际可执行的。
3、可执行的可见性调度
给定一个事务的集合T={t0,t1,t2,….,tn},S是T的一个可见性调度,则S是可执行的,当且仅当S与一个实际调度X保持一致。S与X是保持一致的,当且仅当满足:对于任何两个事务ti、tj∈T(i≠j),(1)如果在X中,则ti→tj在S中;(2)如果在X中,则在S中;(3)如果在X中,则ti→tj在S中。值得说明的是,一个可执行的可见性调度至少需要与一个实际调度保持一致。
值得说明的是,为了描述的方便性,在发明实施例中,可选的,用事务ti表示事务A,用事务tj表示事务B。
图1为本发明提供的事务之间的时序确定方法实施例一的流程示意图。本发明实施例主要以事务集合中的两个事务进行举例说明。具体的,如图1所示,本发明实施例提供的事务之间的时序确定方法,包括:
步骤101:获取事务A和事务B之间的数据依赖关系;
一般来说,给定的事务集合通常为T={t0,t1,t2,….,tn},其可包括多个事务,而且,事务与事务之间均具有一定的数据依赖关系。可选的,本发明实施例均以事务集合T中的两个事务(ti、tj∈T,其中i≠j)之间的数据依赖关系为例进行说明,也即,事务A与事务B之间的数据依赖关系。
具体的,在本实施例中可将事务之间的数据依赖关系记录在依赖关系表中,进而通过查询该依赖关系表即可获取到事务A和事务B之间的数据依赖关系。
步骤102:根据上述数据依赖关系,确定事务A和事务B之间的数据可见性;
其中,数据可见性用于指示对方事务的已提交数据是否可见。
具体的,本发明实施例中的数据可见性与前述的可见性一致。由上述可知,根据数据依赖关系可推断出事务之间的可见性关系,并且,可见性的定义中指出事务写的数据均指已提交的数据,其在事务外部可见,对于未提交的数据只在事务内部可见,在事务外部是不可见的。因此,根据步骤101中确定的事务A与事务B之间的数据依赖关系,可确定出事务A与事务B之间的数据可见性。
步骤103:根据数据可见性,确定事务A和事务B的发生时序。
下述结合事务之间的一致可见性(CV)定义,对步骤103进行说明。
具体的,给定一个事务的集合T={t0,t1,t2,….,tn},S是T的一个调度,则S是满足CV的,当且仅当S满足:(1)对于任何两个事务ti、tj∈T(i≠j),在S中或者ti→tj,或者(没有部分可见或者临时可见);(2)对于任何两个事务ti、tj∈T(i≠j),如果ti→tj,则(3)如果ti和tj相互之间不可见,则ti与tj之间不存在写-写依赖关系。
值得说明的是,一个实际调度是满足CV的,仅当至少有一个与之一致的可见性调度是满足CV的。
对于条件(2),CV在任何两个事务之间确定一个顺序,即如果ti→tj,那么ti就被当作在tj开始之前已经提交的事务,因此ti与tj之间不可能是相互可见的;对于条件(3),如果两个事务相互之间不可见,则这两个事务是并发进行的,不能同时对相同的数据进行更新。
因此,在确定出两个事务之间的数据可见性关系时,便可确定出事务A和事务B的发生时序。
本发明实施例提供的事务之间的时序确定方法中,通过获取事务A和事务B之间的数据依赖关系,进而根据该数据依赖关系,确定事务A和事务B之间的数据可见性,即利用数据可见性指示对方事务的已提交数据是否可见,最后根据数据可见性,确定出事务A和事务B的发生时序。本发明的技术方案,利用事务之间的可见性来确定事务的逻辑时间戳,也即,事务通过与其他事务协商来确定自己的逻辑时间区间,进而利用逻辑时间戳来确定事务之间的时序关系,避免了从中心化的时钟获取时间戳,消除了中心协调节点存在的必要性,提高了分布式数据库系统的扩展性和可靠性。
进一步的,在图1所示实施例的基础上,获取事务A和事务B之间的数据依赖关系(步骤101),可通过如下可行的实现方式实现,具体的,请参照图2所示实施例。
图2为本发明提供的事务之间的时序确定方法实施例二的流程示意图。本发明实施例是在上述实施例的基础上对事务之间的时序确定方法的进一步说明。如图2所示,在本发明实施例提供的事务之间的时序确定方法中,上述步骤101(获取事务A和事务B之间的数据依赖关系),包括:
步骤201:获取数据元组的访问记录;
其中,该访问记录包括:事务A和事务B对每个数据元组的访问事件、以及访问事件的发生时间。
具体的,分布式数据库系统中的每个事务均分配有唯一的事务编号(用TID表示),并且系统中的数据元组,其每个版本都记录有一个事务编号(TID)列表,表示TID列表中的事务对数据元组的该版本具有访问关系。因此,每个数据元组都对应有一个访问列表,该访问列表中记录有处于活跃状态并且已经访问过该数据元组的所有事务的事务编号。所以,在本实施例中可通过查找数据元组的访问列表来获取数据元组的访问记录。
步骤202:根据事务A和事务B对目标数据元组的访问事件、以及访问事件的发生时间,确定事务A和事务B之间的数据依赖关系。
具体的,假设事务集合中的事务A和事务B均对目标数据元组发生了访问事件,根据访问事件的发生时间,便能确定出事务A和事务B之间的数据依赖关系。
可选的,在分布式数据库系统中,对数据元组有访问关系的事务之间维护有一个依赖关系表,用来记录活跃事务之间的读-写依赖关系。在依赖关系表中,若活跃事务tj在活跃事务ti写数据元组A之前读了数据元组A,那么tj与ti之间的读-写依赖关系记为
本发明实施例提供的事务之间的时序确定方法,通过获取数据元组的访问记录来获取事务A和事务B对每个数据元组的访问事件、以及该访问事件的发生时间,进而根据事务A和事务B对目标的数据元组的访问事件、以及访问事件的发生时间,确定事务A和事务B之间的数据依赖关系。本发明的技术方案,通过访问记录来记录事务在目标数据元组上的读操作,利用访问记录来判定事务之间的读写冲突,能够确定出事务之间的数据依赖关系,为后续确定事务之间的时序奠定了基础。
可选的,图3为本发明提供的事务之间的时序确定方法实施例三的流程示意图。本发明实施例是在实施例一和实施例二的基础上对事务之间的时序确定方法的完整性说明。具体的,如图3所示,本发明实施例提供的事务之间的时序确定方法,包括:
步骤301:事务集合中的每个事务被分配一个唯一的事务编号(TID);
步骤302:数据元组的每个版本上均记录有一个TID,每个数据元组对应有一个访问列表;
具体的,事务编号表示产生数据元组相应版本的事务,每个数据元组对应的有一个访问列表,该访问列表用于记录处于活跃状态并且已经访问过该数据元组的所有事务的TID。
步骤303:事务之间的时序确定方法维护一个数据依赖关系表;
其中,该数据依赖关系表用来记录活跃事务之间的读-写依赖关系。
步骤304:当事务对数据元组进行读操作时,根据上述数据依赖关系表确定该事务需要访问的数据元祖的版本,更新该数据元组对应的访问列表。
具体的,当tj读一个数据元组时,总是先读该数据元组最新的版本,如果该版本的事务编号是ti并且存在于依赖关系表中,则该版本对于tj不可见的(因为意味着),此时tj开始读该数据元组旧的版本;否则,当并不存在于依赖关系表中时,tj读取该版本,并且在读的同时将自己的TID记录在该数据元组的访问列表中。
步骤305:当事务对数据元组进行写访问时,对该数据元组施加排它锁直到该数据元组的版本提交。
具体的,当tj对数据元组进行写操作时,首先对该数据元组施加排它锁,用于控制除该事务tj外的其他事务对该数据元组不可写,并且在该tj事务提交该数据元组时,立刻释放该数据元组上的排它锁,也即,一旦tj事务提交该数据元组,则新产生的该数据元组的版本对于其他事务立刻可见。
需要注意的是,在事务tj获得排它锁之后,检查以下条件能否被满足:(i)如果事务tj已经读过该数据元组,则读到的版本必须是该数据元组最新的版本;(ii)如果该数据元组最新版本的TID是ti,则不在依赖关系表中。如果上述两个条件之中的任意一个没有满足,则事务tj需要进行回滚操作,将该事务tj对该数据元组的操作清除,这是因为事务tj的并发事务已经完成对该元组的更新并且已经提交。
步骤306:当事务将其写访问的数据元组提交时,更新该数据元组的访问列表,以及在事务将其写访问的数据元组提交后,更新事务之间的数据依赖关系表。
具体的,当事务tj提交时,遍历事务tj更新过的所有数据元组的访问列表,对每一个事务编号TID(例如,事务ti),将加入数据依赖关系表。当事务tj提交之后,将事务tj从所有的访问列表中移除,并且删除所有与事务tj有依赖关系的事务,例如,对于每一个事务tk,将从数据依赖关系表中移除。
为了证明上述事务之间时序确定方法的正确性,需要证明由该方法中的每一个操作步骤均满足上述一致可见性(CV)定义中的所有条件。下面对图3所示实施例的步骤进行证明:
首先,该图3所示实施例的事务之间时序确定方法不会导致一个事务更新的数据对其他事务部分可见或者临时可见,这是由一致可见性(CV)的定义决定的。由上述步骤305可知,一个事务提交后它对数据元组的所有更新对于其他事务立即可见,如果事务ti更新的数据元组对于事务tj是可见的,则ti更新的所有数据元组对于tj都是可见的,这可避免出现数据元组对其他事务部分可见。
进一步的,数据元组对其他事务临时可见在本发明的事务之间的时序确定方法中也是不可能发生的。具体的,如果tj在ti提交之前读了ti尝试更新的元组,则有存在于依赖关系表中(根据步骤306可知),因此tj不能读ti更新的任一数据元组的版本。因此,其满足一致可见性(CV)定义的条件(1)。
其次,要证明本发明的事务之间的时序确定方法满足一致可见性(CV)定义的条件(2),只需要考虑有数据依赖关系的事务之间的可见性关系,对于没有数据依赖关系的事务,它们之间的可见性关系可以是任意的,并且始终满足条件(2)。
如果事务ti与事务tj之间存在ti→tj,则可以推出或者上述步骤305保证了只有已经提交的数据元组的版本更新对于其他事务才是可见的,因此ti肯定在tj开始之前提交,也就不可能存在,因此对于每一个实际执行方案,都能找到一个一致的可见性调度使得ti→tj、tj→ti不可能同时存在。因此,一致可见性(CV)定义的条件(2)得到了满足。
最后,上述步骤305可确保两个并发事务不能更新相同的元组。如果同时存在,则可以推出并且如果事务ti在事务tj之前提交,ti会将加入依赖关系表,只有当ti完成写操作并提交之后,tj才能获得ti更新过的数据元组上的排它锁,这时已经存在于依赖关系表中,根据步骤305事务tj需要回滚;同样,如果事务tj在事务ti之前提交,则事务ti需要回滚。因此,一致可见性(CV)定义的条件(3)得到了满足。
综上所述,本发明提供的事务之间的时序确定方法满足CV定义。从定义上考虑,CV强于现有的读已提交和可重复读两种隔离级别,能够保证每个事务见到的是一个满足一致性的数据快照。
可选的,在上述任一实施例的基础上,为了进一步提高事务之间时序确定的准确度,下述实施例在确定事务之间的时序时引入时间的概念,相应的,事务之间的时序确定方法的具体实现步骤可参照下述各实施例。
值得说明的是,上述实施例中给出的相关概念和定义,对于下述实施例同样适用。
可选的,为了有效说明事务A与事务B映射到时间轴上时,事务之间的存在一个统一的时间先后顺序,下面首先给出后验快照隔离的定义。
后验快照隔离(PostSI):
假设(s,c)表示一个时间区间,其中s,c分别表示事务开始时间和事务提交时间,并且满足s<c,用I表示这样一个时间区间的集合。给定一个事务的集合T={t0,t1,t2,….,tn},S是T的一个可见性调度,则S是满足SI定义的调度,当且仅当可以找到一个T到I的映射F:T→I,满足:(1)对于任何两个事务ti、tj∈T(i≠j),在S中或者ti→tj,或者(2)假设F(ti)=(si,ci),F(tj)=(sj,cj),则ti→tj存在于S中,当且仅当满足ci≤sj;(3)如果cj>si>sj,或者ci>sj>si(即两个事务的时间区间有重叠),则ti与tj之间不存在写-写依赖关系。
后验快照隔离的定义需要事务之间的可见性关系来确定它们在时间上的先后关系,一个事务能够见到在它开始之前提交的所有事务更新的数据元组的版本(后验快照隔离定义中的条件(2)),另外所有更新事务的提交都遵从一个全局的顺序(后验快照隔离定义中的条件(3)),至于后验快照隔离定义中的条件(1)已经在可见性调度的定义中得到了满足。
后验快照隔离的方案不采用物理时间戳而是通过事务之间的可见性关系来确定事务之间时间上的先后关系,只要能够把这种可见性关系映射至一条时间轴上,使得事务之间能够确定一个统一的逻辑时间轴上的先后关系,则快照隔离的定义就能被满足。如果只考虑调度执行的最终结果,在后验快照隔离与传统的快照隔离之间并不存在语义上的区别。
可选的,本发明上述任一实施例提供的事务之间的时序确定方法,还包括:
获取事务A的起始时间区间和提交时间区间、以及事务B的起始时间区间和提交时间区间。
具体的,假设S是事务集合T的一个CV调度,那么S也是一个满足快照隔离的调度,如果能够找到一个T到I的映射F:T→I,对于任何两个事务ti和tj,时间区间分别为F(ti)=(si,ci),F(tj)=(sj,cj),满足以下约束条件:(1)如果ti→tj,则ci≤sj;(2)如果则ci>sj。
事务之间为了满足快照隔离的调度机制,关键在于给每个事务分配一个合适的时间区间。本发明实施例不采用物理时钟来确定事务的时间区间,而是在事务运行的过程中通过与其他事务的数据依赖关系来确定。在后验快照隔离的调度机制中,每个事务维护有一个起始时间的上/下界(分别用s-和s_表示)和提交时间的下界(用c_表示),在事务运行过程中通过与其他事务的可见性关系来对s-、s_、c_进行调整,最后根据s-、s_、c_来给事务分配一个合适的时间区间。
因此,为了确定出事务之间的时序关系,首先需要获取到各事务的起始时间和提交时间。若以两个事务为例进行说明,则获取事务A的起始时间和提交时间、以及事务B的起始时间和提交时间。
图4为本发明提供的事务之间的时序确定方法实施例四的流程示意图。本发明实施例是在上述各实施例的基础上对事务之间的时序确定方法的进一步说明。对于上述实施例中给出的定义和说明,在本实施例中同样适用。具体的,如图4所示,本发明实施例提供的事务之间的时序确定方法,还包括:
步骤401:获取目标数据元组各个版本的更新时间;
通过分析每个数据元组对应的访问列表,可获知访问列表中处于活跃状态并且已经访问过该目标数据元组的所有事务的事务编号,同时获取到该目标数据元组各个版本的更新时间。
步骤402:根据目标数据元组各个版本的更新时间、事务A的起始时间区间和提交时间区间、以及事务B的起始时间区间和提交时间区间,确定事务A的有效起始时间区间和有效提交时间区间、以及事务B的有效起始时间区间和有效提交时间区间。
具体的,在已知事务A的起始/提交时间区间、事务B的起始/提交时间区间,并获取到目标数据元组各个版本的更新时间时,可根据数据元组各个版本的更新时间来判断对事务的可见性关系,并确定出事务A的有效起始时间区间和有效提交时间区间、以及事务B的有效起始时间区间和有效提交时间区间。
实际上,数据元组上记录有一个产生该数据元组的事务的提交时间,如果新的事务访问了该数据元组,那么新事务的开始时间应该大于该事务的提交时间。数据元组上还记录有最后一个读该数据元组的事务的起始时间,如果新的事务改动了该数据元组,那么新事务的提交时间应该大于该起始时间。
本发明实施例提供的事务之间的时序确定方法,通过获取目标数据元组各个版本的更新时间,进而根据目标数据元组的各个版本更新时间、事务A的起始/提交时间区间以及事务B的起始/提交时间区间,确定事务A的有效起始时间区间和有效提交时间区间、以及事务B的有效起始时间区间和有效提交时间区间,便可保证事务之间存在一个统一的时间先后顺序关系,从而保证得到的时间区间是正确的。
作为一种示例,上述步骤202(根据事务A和事务B对目标数据元组的访问事件、以及访问事件的发生时间,确定事务A和事务B之间的数据依赖关系)的一种可能实现方式通过如下步骤实现。
具体的,上述步骤202(根据事务A和事务B对目标数据元组的访问事件、以及访问事件的发生时间,确定事务A和事务B之间的数据依赖关系),包括:
根据事务A和事务B对目标数据元组的访问事件、访问事件的发生时间、目标数据元组各个版本的更新时间、事务A的起始时间区间和提交时间区间、以及事务B的起始时间区间和提交时间区间,确定事务A和事务B之间的数据依赖关系,并更新事务A的起始时间区间和提交时间区间、事务B的起始时间区间和提交时间区间。
可选的,首先由步骤201可知,通过获取数据元组的访问记录,可获取到事务A和事务B对目标数据元组的访问事件、以及访问事件的发生时间,因此,当事务A和事务B对目标数据元组进行访问时,可获取到事务A和事务B对目标数据元组的访问事件、访问事件的发生时间;其次,当为访问目标数据元组的事务分配起始时间区间和提交时间区间后,通过访问目标数据元组的访问列表以及目标数据元组各个版本的更新时间,可确定出事务A的起始/提交时间区间、以及事务B的起始/提交时间区间,最后根据上述确定的目标数据元组各个版本的更新时间、事务A的起始/提交时间区间、以及事务B的起始/提交时间区间,可实现对事务A和事务B起始时间区间和提交时间区间的更新。
值得说明的是,如果在更新事务A、事务B的起始时间区间和提交时间区间之前来确定事务A和事务B之间的数据依赖关系,那么,本发明实施例中采用的事务A的起始/提交时间区间、以及事务B的起始/提交时间区间是未更新的时间;而如果在更新事务A、事务B的起始/提交时间区间之后来确定事务A和事务B之间的数据依赖关系,此时本发明实施例中采用的事务A的起始/提交时间区间、事务B的起始/提交时间区间均是更新后的时间。
进一步的,在上述实施例提供的事务之间的时序确定方法中,该方法还包括如下步骤:
在事务A对目标数据元组进行写访问时,控制除该事务A外的其他事务对目标数据元组不可写。
具体的,在事务A对目标数据元组进行写访问操作时,首先在给该目标数据元组上加排它锁,用于控制除该事务A外的其他事务对目标数据元组不可写,进而保证在对目标数据元组的值进行更改时,只有该事务A可以对其操作,也即,在同一时间,只有一个事务能够对目标数据元组进行写访问。
但是,一旦事务A对目标数据元组的写访问结束,将该目标数据元组提交时,便立刻释放目标数据元组上的排它锁,则更新后的数据元组的新版本对于其他事务立刻可见。
更进一步的,在本发明上述实施例提供的事务之间的时序确定方法中,该方法还包括:
事务A的起始时间区间满足预设条件时,删除事务A的操作数据。
具体的,在本发明实施例中事务A用ti表示,事务B用tj表示,那么,在事务ti运行期间,如果事务ti的起始时间区间的上下界(上界用si-表示,下界si-用表示)之间出现si->si-,此时,事务ti必须回滚,也即,需要删除事务ti的操作数据,因为事务ti已经不可能存在一个有效的起始时间区间了。
可选的,在一致可见性定义基础上提出的事务之间的时序确定方法中,当引入时间概念时,下述给出完整性的说明。详细请参见图5所示的实施例。
图5为本发明提供的事务之间的时序确定方法实施例五的流程示意图。本发明实施例是在上述各实施例的基础上通过引入起始时间和提交时间的概念对事务之间的时序确定方法的完整性说明。如图5所示,本发明实施例提供的事务之间的时序确定方法中,包括:
步骤501:事务集合中的每个事务被分配一个唯一的事务编号(TID),以及每个事务的起始时间区间和提交时间区间;
具体的,本实施例中的事务以事务B为例进行说明,且事务B用事务tj表示,在事务tj开始时,事务tj的起始时间下界sj-和上界提交时间的下界cj-的初始值分别为的初始值分别为sj-=0、cj-=0。
步骤502:数据元组的每个版本都记录有一个读过该版本的所有事务开始时间戳中的最大值(SID)和产生该版本的事务的提交时间戳(CID);
每个数据元组都对应有一个访问列表,该访问列表,用于记录处于活跃状态并且已经访问过该数据元组的所有事务的事务编号(TID)。
步骤503:事务之间的时序确定方法维护一个数据依赖关系表;
具体的,该数据依赖关系表用来记录活跃事务之间的读-写依赖关系,由于其他数据依赖关系(写-读依赖关系和写-写依赖关系)不存在数据元组版本不一致的情况,在此不予考虑。
步骤504:当事务对数据元组进行读操作时,更新数据元组的访问列表,调整事务的起始时间区间和提交时间区间。
具体的,当tj读一个数据元组时,总是先读该数据元组最新的版本。可选的,用cid表示该版本的CID(产生该版本的事务的提交时间戳),如果则数据元组的该版本对于tj是不可见的,此时tj读取该数据元组旧的版本;否则,tj读取该版本并且在读的同时将自己的TID加入该数据元组的访问列表中。随后,事务tj更新起始/提交时间区间的下界,更新规则为:sj-=max(sj-,cid),cj-=max(sj-,cj-)。
步骤505:当事务对数据元组进行写访问时,对该数据元组施加排它锁直到该数据元组更新后的版本提交。
步骤506:当事务将其写访问的数据元组提交时,更新该数据元组的访问列表以及事务之间的数据依赖关系表,并确定出该事务的起始/提交时间区间以及更新其他与该事务存在数据依赖关系的事务的起始/提交时间区间。
首先,当事务tj提交时,遍历事务tj更新过的所有数据元组的访问列表,对每一个事务编号TID(例如,事务ti),将加入数据依赖关系表。
其次,事务tj需要确定出其起始/提交时间区间,并更新其他事务的起始/提交时间区间。确定和更新过程如下:
(i)sj:sj=sj-;
(ii)cj:对于每一个ti,存在于数据依赖关系表中,设置cj-=max{cj-,si-}。用S表示tj读过的所有版本的SID(也即,读过该版本的事务的开始时间戳中的最大值)的集合,则cj=max({cj-,sj}∪S)+1。
(iii)当sj和cj确定之后,需要通知和事务tj存在数据依赖关系的其它事务去调整它们的时间区间的上/下界。对于每一个事务tk,存在于依赖关系表中,有ck-=max{ck-,sj+1}(因为推出tk1/2tj,有ck>sj);对于每一个事务ti,存在于数据依赖关系表中,有si-=min{si-,cj-1}(因为推出tj1/2ti,有cj>si)。
(iv)最后将tj产生的所有数据元组的版本的CID设置为cj(提交时间),并且对于tj读过的每一个版本,若有SID<sj,则设置SID=sj。
当tj提交之后,将tj从所有的访问列表中移除,并且对于每一个事务tk,将从数据依赖关系表中移除。
步骤507:事务运行期间的事务起始时间区间满足预设条件时,删除事务的操作数据,更新事务之间的数据依赖关系表。
具体的,在事务tj运行期间,如果出现sj->sj-,则tj必须回滚,因为tj已经不可能存在一个有效的开始时间区间。
当事务确定起始/提交时间区间时(上述步骤506),只需要确保不会和时间区间的上/下界产生矛盾即可,比如sj-<sj<sj-,cj-<cj。确定起始时间sj比较简单,因为sj的值不会对后续事务产生影响;而确定cj则需要考虑更多,一方面,cj会被用来设置和事务tj存在读-写依赖关系的事务的上界s-(上述步骤506);另一方面,cj也会被用来当作tj产生的数据元组的版本的CID,进而影响后续事务的下界s_。如果cj太小或者太大,都有可能导致其他事务回滚(使得s_>s-),为了尽量减少这种回滚的可能性,本发明实施例中事务之间的时序确定方法对cj的设置如步骤506中所述。
本发明实施例中的事务之间的时序确定方法是正确的,因为正确性(1)每一个由该方法生成的实际执行调度都是满足一致可见性CV定义;正确性(2)该方法满足后验快照隔离(PostSI)定义的必要条件。具体说明如下:
正确性(1)是很明显的,因为该方法是建立在上述图3所示实施例的确定方法基础之上的;
对于正确性(2),下面逐一考虑后验快照隔离(PostSI)定义中的条件:
(i)如果存在ti→tj,则可以推出或者那么tj必定访问过ti产生并且已提交的数据元组的版本。根据该方法中的步骤504,当tj读这个版本时,会使得sj-≥ci,而sj-≤sj,因此ci≤sj能被满足。
(ii)如果存在则可以推出或者或者如果有或者cj≤si,从而有sj<ci;如果有那么tj必定读了一个ti尝试修改的版本,如果在ti访问该版本之前tj已经提交,则ti获取到的SID满足SID≥sj,根据步骤506,ci必须大于ti读到的每一个数据版本的SID,因此有ci>sj;如果在ti访问该数据版本之后tj才提交,根据步骤506,ti会在提交时更新sj-,即有ci-≥sj,因此有ci>sj。
综上所述,本发明实施例提供的事务之间时序确定方法满足后验快照隔离(PostSI)定义中的必要条件。
根据步骤506,在事务提交时,tj需要把自己的起始/提交时间区间通知给每一个ti(满足),以及tk(满足),并发事务通过这种消息传递协商确定各自的时间区间。然而ti或者tk有可能接收不到tj的通知,因为它们有可能在接收到通知之前就已经提交,但是ti和tk在提交时会主动和tj进行通信,因此可以保证至少有一个方向的通知会及时到达,只要事务之间的协商过程没有中断,最后得到的时间区间就是正确的。
以上描述了事务之间的时序确定方法的实现过程,该过程可以由事务之间的时序确定装置来实现,以下将对事务之间的时序确定装置的内部功能和结构进行说明。对于本发明装置实施例中未披露的细节,请参照本发明方法实施例中的记载。
图6为本发明提供的事务之间的时序确定装置实施例一的结构示意图。如图6所示,本发明实施例提供的事务之间的时序确定装置,包括:
依赖关系获取模块601,用于获取事务A和事务B之间的数据依赖关系;
可见性确定模块602,用于根据依赖关系获取模块601获取到的数据依赖关系,确定事务A和事务B之间的数据可见性;
其中,数据可见性用于指示对方事务的已提交数据是否可见。
时序确定模块603,用于根据可见性确定模块602确定的数据可见性,确定事务A和事务B的发生时序。
本发明实施例提供的事务之间的时序确定装置,可用于执行如图1所示事务之间的时序确定方法实施例中的技术方案,其实现原理和技术效果类似,此处不再赘述。
图7为本发明提供的事务之间的时序确定装置实施例二的结构示意图。本发明实施例是在上述实施例的基础上对事务之间的时序确定装置的进一步说明。如图7所示,在本发明实施例提供的事务之间的时序确定装置中,上述依赖关系获取模块601,包括:访问记录获取单元701和依赖关系确定单元702。
该访问记录获取单元701,用于获取数据元组的访问记录;
其中,访问记录包括:事务A和事务B对每个数据元组的访问事件、以及该访问事件的发生时间。
该依赖关系确定单元702,用于根据事务A和事务B对目标数据元组的访问事件、以及该访问事件的发生时间,确定事务A和事务B之间的数据依赖关系。
本发明实施例提供的事务之间的时序确定装置,可用于执行如图2所示事务之间的时序确定方法实施例中的技术方案,其实现原理和技术效果类似,此处不再赘述。
进一步的,在本发明上述实施例提供的事务之间的时序确定装置中,该装置还包括:时间获取模块。
该时间区间获取模块,用于获取事务A的起始时间区间和提交时间区间、以及事务B的起始时间区间和提交时间区间。
图8为本发明提供的事务之间的时序确定装置实施例三的结构示意图。本发明实施例是在上述实施例的基础上对事务之间的时序确定装置的进一步说明。如图8所示,本发明实施例提供的事务之间的时序确定装置,还包括:
更新时间获取模块801,用于获取目标数据元组各个版本的更新时间;
事务时间更新模块802,用于根据上述目标数据元组各个版本的更新时间、事务A的起始时间区间和提交时间区间、以及事务B的起始时间区间和提交时间区间,确定事务A的有效起始时间区间和有效提交时间区间、以及事务B的有效起始时间区间和有效提交时间区间。
本发明实施例提供的事务之间的时序确定装置,可用于执行如图4所示事务之间的时序确定方法实施例中的技术方案,其实现原理和技术效果类似,此处不再赘述。
进一步的,在本发明上述实施例提供的事务之间的时序确定装置中,上述依赖关系确定单元702,具体用于根据事务A和事务B对目标数据元组各个版本的访问事件、访问事件的发生时间、目标数据元组的更新时间、事务A的起始时间区间和提交时间区间、以及事务B的起始时间区间和提交时间区间,确定事务A和事务B之间的数据依赖关系,并更新事务A的起始时间区间和提交时间区间、事务B的起始时间区间和提交时间区间。
可选的,本发明上述实施例提供的事务之间的时序确定装置,还包括:可写性控制模块。
该可写性控制模块,用于在事务A对目标数据元组进行写访问时,控制除事务A外的其他事务对目标数据元组不可写。
可选的,本发明上述实施例提供的事务之间的时序确定装置,还包括:数据删除模块。
该数据删除模块,用于在事务A的起始时间区间满足预设条件时,删除事务A的操作数据。
本发明实施例提供的事务之间的时序确定方法和装置,用逻辑时间戳来取代物理时间戳,允许事务通过与其他事务协商确定自己的逻辑时间区间,并且给出了利用逻辑时间戳来确定事务之间的时序关系的具体方案,避免了从中心化的时钟获取时间戳,从而完全消除了中心协调节点存在的必要性,而去掉中心协调节点之后,系统的扩展性瓶颈被去除,单点故障将不复存在。
可选的,本发明实施例的技术方案适用于多核的单点服务器和大规模的并行计算平台,提高了分布式数据库系统的扩展性和可靠性。
本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。