分布式事务异常处理方法、装置、计算机设备及存储介质与流程

文档序号:19155054发布日期:2019-11-16 00:38阅读:250来源:国知局
分布式事务异常处理方法、装置、计算机设备及存储介质与流程

本发明涉及计算机技术领域,特别是涉及一种分布式事务异常处理方法、装置、计算机设备及存储介质。



背景技术:

随着科学技术的飞速发展,各种技术层出不穷,分布式事务处理技术在日常应用中也很广泛。两阶段提交是一种比较常用的分布式事务提交方法。但是,在通过两阶段提交分布式事务时,如果提交阶段出现异常,便会丢失事务状态,从而无法完成事务最终的提交。

传统方法中,在两阶段提交过程中,如果一个参与者节点提交事务时出现异常,则参与者节点则读取自身事务日志,并判断自身所处的状态,然后主动与事务管理器通信,告知自身当前处于未提交的状态,从而让事务管理器再向其他参与者节点进行状态确认,并在确认状态完毕后,重新向各个参与者节点发送提交请求,以推进整个事务的完成。然而,传统方法中,需要参与者节点具备根据自身事务日志主动与协调者通信的功能,这样一来,就需要对每个作为参与者节点的数据库自身的代码进行大幅度修改,成本比较高。



技术实现要素:

基于此,有必要针对传统方法操作比较繁琐的问题,提供一种分布式事务异常处理方法、装置、计算机设备及存储介质。

一种分布式事务异常处理方法,所述方法包括:

获取待提交的事务的标识;

向预设存储空间写入所述事务的标识和所述事务的标识所对应的待提交状态标记;

向分布式系统中的参与者节点发送针对所述事务的第一提交请求;

当参与者节点执行所述第一提交请求出现异常时,则

从所述预设存储空间中读取与所述事务的标识对应的待提交状态标记;

根据所述待提交状态标记,向所述参与者节点发送第二提交请求;所述第二提交请求,用于指示所述参与者节点提交所述事务。

在其中一个实施例中,所述方法还包括:

当针对预设存储空间的写入处理正常时,则执行所述向分布式系统中的参与者节点发送针对所述事务的第一提交请求及后续步骤;

当所述写入处理失败时,则向各所述参与者节点发送回滚请求;所述回滚请求,用于指示各所述参与者节点回滚所述事务。

在其中一个实施例中,所述方法还包括:

当所述写入处理超时或在执行所述写入处理过程中宕机时,从所述预设存储空间中读取与所述事务的标识对应的待提交状态标记;

当读取到与所述事务的标识对应的待提交状态标记,则向各所述参与者节点发送针对所述事务的第三提交请求。

在其中一个实施例中,所述预设存储空间中存储的事务的标识仅对应一个状态标记;所述方法还包括:

当未读取到与所述事务的标识对应的待提交状态标记时,向所述预设存储空间中对应写入所述事务的标识和中止状态标记;

再次从所述预设存储空间中读取与所述事务的标识对应的状态标记;

当再次读取到的状态标记为待提交状态标记时,则向分布式系统中的参与者节点发送针对所述事务的第四提交请求。

在其中一个实施例中,所述方法还包括:

当再次读取到的状态标记为中止状态标记时,则向各参与者节点发送回滚请求;所述回滚请求,用于指示各参与者节点回滚所述事务。

在其中一个实施例中,所述待提交的事务为预提交处理成功的事务;

在所述获取待提交的事务的标识之前,所述方法还包括:

当对所述事务的预提交处理出现异常时,则

向各所述参与者节点发送回滚请求;所述回滚请求,用于指示各所述参与者节点回滚所述事务。

在其中一个实施例中,所述从所述预设存储空间中读取与所述事务的标识对应的待提交状态标记包括:

通过针对各参与者节点分别设置的代理节点,从所述预设存储空间中读取与所述事务的标识对应的待提交状态标记;

所述根据所述待提交状态标记,向所述参与者节点发送第二提交请求包括:

通过各代理节点,根据所述待提交状态标记,向所述参与者节点发送第二提交请求。

在其中一个实施例中,所述方法还包括:

通过各所述代理节点,以预设时间间隔从与所述代理节点对应的参与者节点中,获取待提交事务的标识集合;

当所述待提交的事务的标识在至少两次获取的标识集合中皆存在时,则判定参与者节点执行所述第一提交请求出现异常。

在其中一个实施例中,所述方法还包括:

从各参与者节点中分别获取待提交事务的标识子集合,得到标识总集合;

获取标识总集合中各标识的生成时间;

选取最早的生成时间,得到基准时间;

从所述预设存储空间中,删除写入时间早于所述基准时间的标识所对应的事务日志。

在其中一个实施例中,所述方法还包括:

在生成每个事务的标识时,根据当前时间,生成用于表征所述标识的生成时间的时间戳;

生成唯一标识所述事务的标识;所述标识的字段中包括所述时间戳;

所述获取标识总集合中各标识的生成时间包括:

解析标识总集合中各标识的字段,获取所述标识中的时间戳。

在其中一个实施例中,所述参与者节点为区块链节点。

一种分布式事务异常处理装置,所述装置包括:

状态写入模块,用于获取待提交的事务的标识;向预设存储空间写入所述事务的标识和所述事务的标识所对应的待提交状态标记;

提交模块,用于向分布式系统中的参与者节点发送针对所述事务的第一提交请求;

状态读取模块,用于当参与者节点执行所述第一提交请求出现异常时,则从所述预设存储空间中读取与所述事务的标识对应的待提交状态标记;

所述提交模块还用于根据所述待提交状态标记,向所述参与者节点发送第二提交请求;所述第二提交请求,用于指示所述参与者节点提交所述事务。

一种计算机设备,包括存储器和处理器,所述存储器中存储有计算机程序,所述计算机程序被所述处理器执行时,使得所述处理器执行如下步骤:

获取待提交的事务的标识;

向预设存储空间写入所述事务的标识和所述事务的标识所对应的待提交状态标记;

向分布式系统中的参与者节点发送针对所述事务的第一提交请求;

当参与者节点执行所述第一提交请求出现异常时,则

从所述预设存储空间中读取与所述事务的标识对应的待提交状态标记;

根据所述待提交状态标记,向所述参与者节点发送第二提交请求;所述第二提交请求,用于指示所述参与者节点提交所述事务。

一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时,使得所述处理器执行如下步骤:

获取待提交的事务的标识;

向预设存储空间写入所述事务的标识和所述事务的标识所对应的待提交状态标记;

向分布式系统中的参与者节点发送针对所述事务的第一提交请求;

当参与者节点执行所述第一提交请求出现异常时,则

从所述预设存储空间中读取与所述事务的标识对应的待提交状态标记;

根据所述待提交状态标记,向所述参与者节点发送第二提交请求;所述第二提交请求,用于指示所述参与者节点提交所述事务。

上述分布式事务异常处理方法、装置、计算机设备及存储介质,针对待提交的事务,在向各参与者节点下发提交请求之前,事务管理器会向预设存储空间写入所述事务的标识和所述事务的标识所对应的待提交状态标记,然后再向各参与者节点下发提交请求。这样一来,当任意一个参与者节点执行所述第一提交请求出现异常时,则可以从所述预设存储空间中读取与所述事务的标识对应的待提交状态标记,即可以获知该事务处于待提交状态,从而避免出现事务状态丢失的情况。进而,可以根据所述待提交状态标记,向所述参与者节点发送第二提交请求;所述第二提交请求,用于指示所述参与者节点再次提交所述事务。这种处理不需要改变参与者节点本身的性能,就可以避免在提交事务时丢失事务状态的情况,大大降低了成本。

附图说明

图1为一个实施例中分布式事务异常处理方法的应用场景图;

图2a为另一个实施例中分布式事务异常处理方法的应用场景图;

图2b为又一个实施例中分布式事务异常处理方法的应用场景图;

图3为一个实施例中分布式事务异常处理方法的流程示意图;

图4为一个实施例中清除分布式事务日志的原理示意图;

图5为另一个实施例中分布式事务异常处理方法的流程示意图;

图6为一个实施例中的传统方法的时序简示图;

图7为一个实施例中的本申请分布式事务异常处理方法的时序简示图;

图8为一个实施例中分布式事务异常处理装置的框图;

图9为另一个实施例中分布式事务异常处理装置的框图;

图10为一个实施例中计算机设备的框图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

图1为一个实施例中分布式事务异常处理方法的应用场景图。参照图1,该应用场景中包括通过网络连接的事务管理器110和多个参与者节点120。其中,参与者节点120即为数据库。事务管理器110,是管理事务的设备。事务管理器110可以是服务器。服务器可以用独立的服务器或者是多个物理服务器组成的服务器集群来实现。

事务管理器110可以获取待提交的事务的标识;向预设存储空间对应写入事务的标识和待提交状态标记。事务管理器110可以向分布式系统中的各参与者节点120发送针对事务的第一提交请求。当参与者节点120执行第一提交请求出现异常时,事务管理器110则可以从预设存储空间中读取与事务的标识对应的待提交状态标记。事务管理器110可以根据待提交状态标记,向参与者节点120发送第二提交请求;第二提交请求,用于指示参与者节点120提交事务。

图2a为另一个实施例中分布式事务异常处理方法的应用场景图。参照图2a,该应用场景中包括事务管理器110、多个参与者节点120、存储设备130、以及分别与各参与者节点120对应设置的代理节点140。其中,存储设备130,是用于提供预设存储空间的设备。代理节点140,是随每个参与者节点120一同部署的、且用于检测和处理事务异常状态的设备。

事务管理器110可以获取待提交的事务的标识,向存储设备130所提供的预设存储空间中写入所述事务的标识和该事务的标识所对应的待提交状态标记。事务管理器110可以向分布式系统中的各参与者节点120发送针对所述事务的第一提交请求。当各代理节点140检测到自身所对应的参与者节点120执行所述第一提交请求出现异常时,则从存储设备130所提供的预设存储空间中读取与所述事务的标识对应的待提交状态标记。各代理节点140可以根据所述待提交状态标记,向所对应的参与者节点140发送第二提交请求;所述第二提交请求,用于指示该参与者节点140提交所述事务。

可以理解,代理节点的功能也可以通过事务管理器自身来完成,可以对应每个参与者节点部署一个事务管理器,并在每个事务管理器中开启一个后台线程来执行和代理节点相同的操作。

可以理解,图2a中的参与者节点120可以是区块链节点。图2b是以区块链节点作为参与者节点的应用场景图。参照图2b,该应用场景中包括事务管理器110、多个区块链节点150、存储设备130、以及分别与各区块链节点150对应设置的代理节点140。

图3为一个实施例中分布式事务异常处理方法的流程示意图。本实施例中的该分布式事务异常处理方法可以应用于计算机设备,现主要以计算机设备为图1中的事务管理器110进行举例说明。参照图3,该方法具体包括如下步骤:

s302,获取待提交的事务的标识。

其中,待提交的事务,是指预提交处理成功的、但尚未提交的事务。预提交,是指参与者节点在提交事务前,先在参与者节点的本地预先执行该事务的处理过程。

事务的标识,用于唯一标识事务。事务,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。

可以理解,本申请各实施例中的事务,是指分布式事务。可以理解,分布式事务,是指事务的参与者、支持事务的服务器、数据库以及事务管理器分别位于不同的分布式系统的不同节点之上。

具体地,用户可以基于终端向事务管理器发送执行事务的开始指令,终端可以确定执行该事务的参与者节点(即执行该事务的数据库),并将确定的参与者节点告知事务管理器。事务管理器接收到该开始指令后,可以向所确定的参与者节点,发送开始请求,以询问各参与者节点是否可以开始执行事务。各参与者节点响应开始请求,在各参与者节点的本地开始这个事务,并返回已经开始的响应消息至事务管理器。

事务管理器在接收到该响应消息后,则可以进入预提交阶段。具体地,事务管理器可以向各参与者节点发送预提交请求,并等待所有参与者节点的答复。该预提交请求中携带各参与者节点针对该事务所需要完成的内容。该预提交请求,用于指示各参与者节点根据携带的内容,执行该事务、但不提交执行完毕的该事务。

可以理解,在分布式系统中,由于一个事务是由多个参与者节点共同参与完成,所以,是由每个参与者节点在本地完成自身所对应的分支事务,从而完成这整个事务。需要说明的是,所有参与者节点所对应的分支事务,构成一个完整的事务。

为了便于理解分支事务和完整的事务之间的关系,现举例说明。假设一个从账户a转账100元到账户b的转账场景。那么,从该账户a转账100元到账户b这就是一个完整的事务。那么,账户a所对应的数据库和账户b所对应的数据库则分别为一个参与者节点,即为参与者节点a和参与者节点b。在执行这个事务时,参与者节点a所要做的事情,就是从账户a中扣款100元这一个分支事务1,参与者节点b所要做的事情,就是在账户b中增加100元这一个分支事务2。参与者节点a和参与者节点b所完成的分支事务1和分支事务2,则构成一个完整的事务。参与者节点a和参与者节点b共同完成这个完整的事务。

因此,在预提交阶段,参与者节点根据所接收到的预提交请求,在参与者节点本地执行自身所对应的分支事务后,不提交所执行完毕的该分支事务。当所有的参与者节点皆成功执行自身所需要完成的事务的内容(即分支事务),则会向事务管理器返回可以提交事务的消息。这种情况下,即完成了对该事务的预提交阶段处理,该事务即进入了待提交状态,属于待提交的事务。事务管理器则可以获取待提交的事务的标识。

在一个实施例中,事务管理器可以通过各参与者节点提供的用于与事务管理器对接的标准接口,向各参与者节点发送上述开始请求和预提交请求。

在一个实施例中,该标准接口,可以是基于xa协议实现的接口。xa协议,是由tuxedo首先提出的,并交给x/open组织,作为资源管理器(数据库)与事务管理器的接口标准。目前,很多开源数据库(比如,mysql,postgresql等)都提供该接口支持。

s304,向预设存储空间写入事务的标识和事务的标识所对应的待提交状态标记。

其中,预设存储空间,是预先设置的用于写入事务状态的存储空间。待提交状态标记,用于表示事务处于待提交状态。

在一个实施例中,预设存储空间,可以是一个专门的存储设备。在另一个实施例中,预设存储空间也可以是从事务管理器中划分出来的一块用于存储事务状态的存储区域。这里,对预设存储空间的具体实现形式不做限定。

具体地,事务管理器可以向预设存储空间对应写入事务的标识和待提交状态标记。即,在预设存储空间中,待提交的事务的标识和待提交状态标记对应存储,以表明该事务属于待提交状态。

在一个实施例中,事务管理器可以以“xid:commit”形式,向预设存储空间对应写入事务的标识和待提交状态标记。其中,xid即为事务的标识。commit,即用于表示事务处于待提交状态,相当于待提交状态标记。

在一个实施例中,预设存储空间,是一个可靠的存储空间,用于对所写入的事务的标识和待提交状态标记实现持久化存储。

s306,向分布式系统中的参与者节点发送针对事务的第一提交请求。

其中,分布式系统中的参与者节点,即分布式系统中参与执行该事务的节点。可以理解,参与者节点可以为数据库。

在一个实施例中,参与者节点可以为区块链节点。

其中,区块链(blockchain)是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。

可以理解,事务处于待提交状态,说明,所有参与者节点皆针对事务预提交处理完毕。那么,在向预设存储空间对应写入所述事务的标识和待提交状态标记后,事务管理器则可以向各参与者节点发送针对该事务的第一提交请求,以指示各参与者节点将针对该事务所执行的内容进行提交。

在一个实施例中,事务管理器可以通过各参与者节点提供的用于与事务管理器对接的标准接口,向各参与者节点发送针对事务的第一提交请求。

具体地,事务管理器可以通过基于xa协议实现的接口,向各参与者节点发送针对事务的第一提交请求(即“xacommit”,其中,xa即为基于xa协议实现的接口,“xacommit”即为通过基于xa协议实现的接口发送的第一提交请求)。

s308,当参与者节点执行第一提交请求出现异常时,则从预设存储空间中读取与事务的标识对应的待提交状态标记。

具体地,各参与者节点在接收到第一提交请求时,则可以将针对该事务所执行的内容进行提交。提交的结果可以包括正常提交成功或者提交异常。

当任意一个参与者节点执行第一提交请求出现异常时,即并非所有参与者节点皆成功执行该第一提交请求时,则可以从预设存储空间中读取与事务的标识对应的待提交状态标记,以获知该事务处于待提交状态。

s310,根据待提交状态标记,向参与者节点发送第二提交请求;第二提交请求,用于指示参与者节点提交事务。

具体地,事务管理器可以根据读取到的待提交状态标记,向参与者节点发送第二提交请求。参与者节点在接收到该第二提交请求后,可以再次提交该事务。即,再次提交针对该事务所执行的内容。

需要说明的是,也可以不通过事务管理器执行步骤s308~s310,而是通过图2所示应用场景中的针对各参与者节点分别设置的代理节点来执行步骤s308~s310。

上述分布式事务异常处理方法,针对待提交的事务,在向各参与者节点下发提交请求之前,事务管理器会向预设存储空间对应写入所述事务的标识和待提交状态标记,然后再向各参与者节点下发提交请求。这样一来,当任意一个参与者节点执行所述第一提交请求出现异常时,则可以从所述预设存储空间中读取与所述事务的标识对应的待提交状态标记,即可以获知该事务处于待提交状态,从而避免出现事务状态丢失的情况。进而,可以根据所述待提交状态标记,向所述参与者节点发送第二提交请求;所述第二提交请求,用于指示所述参与者节点再次提交所述事务。这种处理不需要改变参与者节点本身的性能,就可以避免在提交事务时丢失事务状态的情况,大大降低了成本。

此外,修改数据库本身的代码,会很大程度上引入新的问题,进而可能导致对数据库性能的降低。采用本申请各实施例中的分布式事务异常处理方法能够避免出现该问题,提高了数据库安全性和准确性。

在一个实施例中,该方法还包括:当针对预设存储空间的写入处理正常时,则执行步骤s306向分布式系统中的参与者节点发送针对所述事务的第一提交请求及后续步骤;当所述写入处理失败时,则向各所述参与者节点发送回滚请求;所述回滚请求,用于指示各所述参与者节点回滚所述事务。

其中,针对预设存储空间的写入处理,是指向预设存储空间对应写入所述事务的标识和待提交状态标记的处理过程。

可以理解,写入处理的结果可以包括写入处理正常和写入处理失败。

针对预设存储空间的写入处理正常,是指正常地(在正常时间范围内)将事务的标识和待提交状态标记对应写入至预设存储空间中。即,在预设存储空间中正常地记录了事务的待提交状态。

写入处理失败,是指事务的标识和待提交状态标记未能写入至预设存储空间中。即,在预设存储空间中记录事务的待提交状态过程中出错了,所以未能记录事务的待提交状态。由于事务管理器可以以“xid:commit”形式,向预设存储空间对应写入事务的标识和待提交状态标记,所以,相当于写入事务状态“xid:commit”出错。

可以理解,当针对预设存储空间的写入处理正常时,说明正常地写入事务的状态。这样一来,即使后续提交事务失败,也可以从预设存储空间中读取到事务的标识所对应的待提交状态标记,因而,就可以放心地执行步骤s306向分布式系统中的参与者节点发送针对所述事务的第一提交请求及后续步骤。

然而,当写入处理失败时,说明预设存储空间中并未对应存储事务的标识和待提交状态标记,那么,就无法从预设存储空间中,读取到与事务的标识对应的待提交状态标记。这种情况下,当后续处理出现异常时,就无法从预设存储空间中获知事务的状态,从而出现丢失事务状态的情况。因此,事务管理器则可以直接向各所述参与者节点发送回滚请求,以指示各所述参与者节点回滚在各参与者节点本地的分支事务,从而避免后续出现丢失事务状态的情况。各参与者节点则在接收到回滚请求后,可以在参与者节点的本地对事务的分支事务进行回滚处理,以恢复到未处理事务的初始状态。

具体地,事务管理器可以通过基于xa协议实现的接口,向各参与者节点发送针对事务的回滚请求(即“xarollback”,其中,xa即为基于xa协议实现的接口,rollback是回滚,“xarollback”即为通过基于xa协议实现的接口发送的回滚请求)。

上述实施例中,写入处理正常,说明能够从预设存储空间中读取到待提交状态标记,那么,则可以向分布式系统中的参与者节点发送针对该事务的第一提交请求,这样即使后续出现异常,也能够获知事务状态,促进事务的提交,相较于以往一出现提交异常,就丢失事务状态的情况而言,提高了事务提交的成功率以及完成事务的效率。所述写入处理失败时,则向各所述参与者节点发送回滚请求,直接回滚事务,避免浪费不必要的资源来进行后续出现异常无法解决的处理。

在一个实施例中,该方法还包括:当所述写入处理超时或在执行所述写入处理过程中宕机时,从所述预设存储空间中读取与所述事务的标识对应的待提交状态标记;当读取到与所述事务的标识对应的待提交状态标记,则向各所述参与者节点发送针对所述事务的第三提交请求。

可以理解,写入处理的结果可以包括写入处理超时和执行所述写入处理过程中宕机。

其中,写入处理超时,是指在向预设存储空间中写入事务的标识和待提交状态标记的过程超时,即没有在正常时间内,将事务的标识和待提交状态标记对应写入预设存储空间中。由于事务管理器可以以“xid:commit”形式,向预设存储空间对应写入事务的标识和待提交状态标记,所以,写入处理超时相当于写入事务状态“xid:commit”超时。

可以理解,这种情况下,事务管理器并不确定是否成功将事务的标识和待提交状态标记对应写入预设存储空间中。因此,写入处理超时,可以包括将事务的标识和待提交状态标记对应写入了预设存储空间、以及未将事务的标识和待提交状态标记对应写入预设存储空间的两种情况。

执行所述写入处理过程中宕机,是指在向预设存储空间中写入事务的标识和待提交状态标记的过程中,事务管理器出现宕机情况。可以理解,相当于写入事务状态“xid:commit”时,事务管理器宕机。

这种情况下,事务管理器同样不确定是否成功将事务的标识和待提交状态标记对应写入预设存储空间中。因此,执行所述写入处理过程中宕机,可以包括将事务的标识和待提交状态标记对应写入了预设存储空间、以及未将事务的标识和待提交状态标记对应写入预设存储空间的两种情况。

那么,当所述写入处理超时或在执行所述写入处理过程中宕机时,事务管理器可以从所述预设存储空间中读取与所述事务的标识对应的待提交状态标记。由于预设存储空间中可以写入事务的标识和待提交状态标记,也可能未写入事务的标识和待提交状态标记。那么,在读取时可能读取到与所述事务的标识对应的待提交状态标记,也可能未读取到与所述事务的标识对应的待提交状态标记。

当读取到与所述事务的标识对应的待提交状态标记,事务管理器则获知了事务当前处于待提交状态,即了解了事务当前的状态,那么,事务管理器则可以向各所述参与者节点发送针对所述事务的第三提交请求。第三提交请求,用于指示参与者节点将在参与者节点本地完成预提交的分支事务进行提交。从而,推进事务的完成。

可以理解,在一个实施例中,当未读取到与事务的标识对应的待提交状态标记时,事务管理器则可以直接向各参与者节点发送回滚请求,以指示各参与者节点统一回滚该事务。即,回滚请求,用于各参与者节点在参与者节点的本地回滚所执行的分支事务。

在其他实施例中,写入处理超时或者写入处理过程中宕机的情况,可能是在读取的时候,事务管理器暂时没来得及在预设存储空间中对应写入事务的标识和待提交状态标记,而并非不写入。所以,这种情况下,可以不立马直接回滚事务。事务管理器可以距首次读取的时间达到预设时间间隔时,再次从预设存储空间中读取是否存在与事务的标识对应的状态标记,如果仍然没有,则再向各参与者节点发送回滚请求,以指示各参与者节点统一回滚该事务。事务管理器也可以尝试向预设存储空间中对应于事务的标识写入一条中止状态标记,并再次从预设存储空间中获取该事务的标识对应的状态标记,如果该事务的标识所对应的状态标记仍为中止状态标记时,则回滚事务,即向参与者节点发送回滚请求。可以理解,预设存储空间中存储的事务的标识可以仅对应一个状态标记,也可以对应记录多个状态标记。最终可以根据最新写入的状态标记作为最终的状态标记。对此不作限定。

需要说明的是,当写入处理超时或在执行写入处理过程中宕机时,也可以由代理节点从预设存储空间中读取与事务的标识对应的待提交状态标记;当读取到与事务的标识对应的待提交状态标记,则各代理节点向所对应的参与者节点发送针对事务的第三提交请求,以指示各参与者节点提交该事务。即,指示各参与者节点提交在本地执行的分支事务,从而提交完整的事务。

可以理解,可以是代理节点自身主动进行检测未被正常提交的待提交的事务。一般情况下,待提交的事务未被正常提交的情况可以包括写入处理超时或在执行写入处理过程中宕机,所以,当代理节点主动检测到未被正常提交的待提交的事务时,则可以获知可能是出现了写入处理超时或在执行写入处理过程中宕机。那么,代理节点则可以执行从预设存储空间中读取与事务的标识对应的待提交状态标记的步骤。需要说明的是,代理节点检测到未被正常提交的待提交的事务,还可能是出现了提交异常的情况,即事务管理器已经向各参与者节点发送针对事务的第一提交请求了,但是,参与者节点执行第一提交请求出现异常了,这种情况下,代理节点也可以检测到未被正常提交的待提交的事务。

在其他实施例中,当所述写入处理超时或在执行所述写入处理过程中宕机时,事务管理器可以通知代理节点,代理节点在接收到事务管理器的该通知时,则可以执行从预设存储空间中读取与事务的标识对应的待提交状态标记的步骤。

上述实施例中,当所述写入处理超时或在执行所述写入处理过程中宕机时,也能够从所述预设存储空间中读取与所述事务的标识对应的待提交状态标记,当读取到与所述事务的标识对应的待提交状态标记,则向各所述参与者节点发送针对所述事务的第三提交请求,以推进对事务的提交,从而提高了完成事务的效率。

在一个实施例中,预设存储空间中存储的事务的标识仅对应一个状态标记。该方法还包括:当未读取到与所述事务的标识对应的待提交状态标记时,向所述预设存储空间中对应写入所述事务的标识和中止状态标记;再次从所述预设存储空间中读取与所述事务的标识对应的状态标记;当再次读取到的状态标记为待提交状态标记时,则向分布式系统中的参与者节点发送针对所述事务的第四提交请求。

本实施例中,预设存储空间中存储的事务的标识仅对应一个状态标记。即,一旦预测存储空间中对应写入了事务的标识和相应的状态标记,则无法再对应于该事务的标识添加另一个状态标记了。比如,以及针对事务的标识成功添加上了中止状态标记,后续就无法再对该事务的标识添加待提交状态标记了。

其中,中止状态标记,用于标示事务处于中止、不处理的状态。

具体地,当未读取到与所述事务的标识对应的待提交状态标记时,事务管理器可以向所述预设存储空间中对应写入所述事务的标识和中止状态标记。

可以理解,向预设存储空间中对应写入所述事务的标识和中止状态标记的写入处理结果可以包括写入成功和写入失败的情况。由于在向预设存储空间中写入事务的标识和待提交状态标记的过程超时或事务管理器宕机的情况下,在首次从预设存储空间中未读取到事务的标识对应的待提交状态标记时,可能事务管理器还在尝试向预设存储空间中写入待提交状态标记只是尚未及时写入。所以,在尝试向预设存储空间中对应写入所述事务的标识和中止状态标记时,可能之前没有写入的待提交状态标记已经对应于事务的标识写入了预设存储空间中了。由于,预设存储空间中存储的事务的标识仅唯一对应一个状态标记,所以,这种情况下,就无法再次对应于该事务的标识写入一个中止状态标记了,因此,针对中止状态标记的写入就会失败。

此外,在尝试向预设存储空间中对应写入所述事务的标识和中止状态标记时,可能之前没有写入的待提交状态标记仍然未对应于事务的标识写入了预设存储空间中。这种情况下,预设存储空间中就不存在该事务的标识,也不存在该事务的标识对应的状态标记,则可以将事务的标识和中止状态标记对应写入至预设存储空间中,即写入成功。可以理解,当成功将事务的标识和中止状态标记对应写入至预设存储空间后,由于预设存储空间中存储的事务的标识仅唯一对应一个状态标记,所以,后续事务管理器也就无法对应于该事务的标识写入待提交状态标记。

在向所述预设存储空间中对应写入所述事务的标识和中止状态标记之后,事务管理器可以再次从所述预设存储空间中读取与所述事务的标识对应的状态标记。当读取到的状态标记为待提交状态标记时,即,获知当前的事务状态为待提交状态,则可以向分布式系统中的参与者节点发送针对所述事务的第四提交请求。第四提交请求,用于指示各参与者节点提交该事务,即各参与者节点提交在本地所执行的分支事务。

在一个实施例中,可以是代理节点从所述预设存储空间中读取与所述事务的标识对应的待提交状态标记,当未读取到与所述事务的标识对应的待提交状态标记时,代理节点可以向所述预设存储空间中对应写入所述事务的标识和中止状态标记。在向预设存储空间中对应写入所述事务的标识和中止状态标记之后,代理节点可以再次从所述预设存储空间中读取与所述事务的标识对应的状态标记;当再次读取到的状态标记为待提交状态标记时,代理节点则可以向分布式系统中的参与者节点发送针对所述事务的第四提交请求。

上述实施例中,当未读取到与所述事务的标识对应的待提交状态标记时,向所述预设存储空间中对应写入所述事务的标识和中止状态标记。这样一来,就能够避免在预设存储空间中一个事务的标识对应两种状态。接着,再次从所述预设存储空间中读取与所述事务的标识对应的状态标记。这样必然能够读到与事务的标识唯一对应的事务状态,从而能够根据该事务状态确定后续如何处理,解决了丢失事务状态的问题。当再次读取到的状态标记为待提交状态标记时,则向分布式系统中的参与者节点发送针对所述事务的第四提交请求。即,相当于既能够给写入超时或宕机一个缓冲时间,在这个期间待提交状态标记仍有可能写入到预设存储空间中,如果写入,则能够读取到,从而能够推进事务的提交。

在一个实施例中,该方法还包括:当再次读取到的状态标记为中止状态标记时,则向各参与者节点发送回滚请求;所述回滚请求,用于指示各参与者节点回滚所述事务。

可以理解,如果在向所述预设存储空间中对应写入所述事务的标识和中止状态标记时,预设存储空间中暂未对应于该事务的标识写入待提交状态标记,则事务管理器可以成功在预设存储空间中对应写入所述事务的标识和中止状态标记,后续无法再对应于该事务的标识写入待提交状态标记。这种情况下,事务管理器从预设存储空间中读取的与事务的标识对应的状态标记,则为中止状态标记。当再次读取到的状态标记为中止状态标记时,则说明要中止处理该事务,事务管理器则可以根据中止状态标记,向各参与者节点发送回滚请求。该回滚请求,用于指示各参与者节点回滚该事务。从而实现各参与者节点对该事务的统一回滚。

在一个实施例中,当代理节点再次读取到的状态标记为中止状态标记时,代理节点则可以向各参与者节点发送回滚请求;所述回滚请求,用于指示各参与者节点回滚所述事务。

上述实施例中,当再次读取到的状态标记为中止状态标记时,则可以明确获知该事务的状态为中止状态,此时,则可以向各参与者节点发送回滚请求;所述回滚请求,用于指示各参与者节点回滚所述事务。从而,根据在不丢失事务状态的情况下,统一对各参与者节点进行回滚,保证了分布式处理的统一性。

在一个实施例中,所述待提交的事务为预提交处理成功的事务。在步骤s202获取待提交的事务的标识之前,该方法还包括:当对所述事务的预提交处理出现异常时,则向各所述参与者节点发送回滚请求;所述回滚请求,用于指示各所述参与者节点回滚所述事务。

可以理解,待提交的事务,是处于待提交状态的事务。

可以理解,预提交处理,即为准备阶段。事务管理器可以向各参与者节点发送预提交请求,从而进入预提交处理阶段。各参与者节点可以对该事务进行预提交处理。

在一个实施例中,事务管理器可以通过基于xa协议实现的接口,向各参与者节点发送预提交请求。那么,预提交处理阶段,即为xaprepare阶段。

当各参与者节点对一个事务的预提交处理成功后,该事务则处于待提交状态,属于待提交的事务。当各参与者节点对该事务的预提交处理出现异常时,事务管理器则可以向参与者节点发送回滚请求。回滚请求,用于指示各所述参与者节点统一在各自的本地回滚事务。可以理解,预提交处理出现异常,可以包括预提交处理超时或预提交处理出错(即失败)。

上述实施例中,当对所述事务的预提交处理出现异常时,则说明未准备好,则可以直接指示各参与者节点回滚事务,避免一直处于异常状态导致的资源的浪费。

在一个实施例中,步骤s308包括:当参与者节点执行第一提交请求出现异常时,通过针对各参与者节点分别设置的代理节点,从所述预设存储空间中读取与所述事务的标识对应的待提交状态标记。步骤s310包括:通过各代理节点,根据所述待提交状态标记,向所述参与者节点发送第二提交请求。

需要说明的是,针对每个参与者节点,皆对应部署设置了相应的代理节点。即,参与者节点和代理节点一一对应。第二提交请求,用于指示参与者节点提交该事务。

可以理解,可以是代理节点自身主动针对所对应的参与者节点进行检测,来判定所对应的参与者节点是否执行第一提交请求出现异常,当判定出现异常时,代理节点则从所述预设存储空间中读取与所述事务的标识对应的待提交状态标记,并根据所述待提交状态标记,向所对应的参与者节点发送第二提交请求。

在其他实施例中,也可以是,事务管理器在确定参与者节点执行第一提交请求出现异常时,则通知出现异常的参与者节点所对应设置的代理节点,代理节点在接收到的事务管理器发送的参与者节点执行第一指令出现异常的通知后,则可以从所述预设存储空间中读取与所述事务的标识对应的待提交状态标记,并根据所述待提交状态标记,向所对应的参与者节点发送第二提交请求。

在一个实施例中,该方法还包括:通过各所述代理节点,以预设时间间隔从与所述代理节点对应的参与者节点中,获取待提交事务的标识集合;当所述待提交的事务的标识在至少两次获取的标识集合中皆存在时,则判定参与者节点执行所述第一提交请求出现异常。

其中,待提交事务的标识,是指待提交的事务的唯一标识,用于唯一标识待提交的事务。待提交事务的标识集合,是包括至少一个待提交事务的标识的集合。可以理解,从每个参与者节点中,获取的待提交事务的标识集合中包括至少一个预提交处理成功、且待该参与者节点提交的事务的标识。

预设时间间隔,大于事务正常提交时长。正常提交时长,是事务被正常提交所需要的时长。

具体地,代理节点,可以自发地以预设时间间隔,从与所述代理节点对应的参与者节点中,获取待提交事务的标识集合。由于预设时间间隔,大于事务正常提交时长,所以,如果事务被正常提交,那么,就不可能在获取的标识集合中出现两次。所以,当待提交的事务的标识在至少两次获取的标识集合中皆存在时,则说明该待提交的事务没有在正常提交时长内提交,那么就是在提交阶段出现了异常,因此,可以判定参与者节点执行所述第一提交请求出现异常。代理节点则可以执行步骤s308及后续步骤。

上述实施例中,通过代理节点来自发地从预设存储空间中读取与所述事务的标识对应的待提交状态标记,并通过各代理节点,根据所述待提交状态标记,向所述参与者节点发送第二提交请求。相当于通过增加代理模块,即可以实现对事务提交出现异常的情况,进行重新提交,从而推进事务的完成,而不需要更改数据库本身的代码这一繁复操作,提高了事务完成的效率。

在一个实施例中,该方法还包括:从各参与者节点中分别获取待提交事务的标识子集合,得到标识总集合;获取标识总集合中各标识的生成时间;选取最早的生成时间,得到基准时间;从所述预设存储空间中,删除写入时间早于所述基准时间的标识所对应的事务日志。

可以理解,每个参与者节点中皆存储有待提交事务的标识子集合。每个参与者节点中存储的待提交事务的标识子集合,是指待该参与者节点提交的事务的标识的集合。即,该待提交事务的标识子集合中包括至少一个待所存储至的参与者节点提交的事务的标识。

标识总集合,是包括各标识子集合的集合。比如,有两个参与者节点db1和db2,其中,参与者节点db1的待提交事务的标识子集合为(xid1,xid2),参与者节点db2的待提交事务的标识子集合为(xid1,xid3),那么,待提交事务的标识总集合为(xid1,xid2,xid3)。

标识的生成时间,是生成事务的标识时间。可以理解,标识的生成时间可以是时间格式(比如,****年**月**日)也可以是时间戳形式。这里对标识的生成时间的表现形式不作限定。基准时间,是用于做比对参照的时间。写入时间,是将事务的标识写入预设存储空间的时间。

具体地,事务管理器从各参与者节点中获取标识子集合之后,可以汇总各标识子集合,得到标识总集合。事务管理器可以获取标识总集合中各标识的生成时间,并将各标识的生成时间进行比对,选取最早的生成时间,作为基准时间。事务管理器可以从所述预设存储空间中所存储的事务的标识中,查找写入时间早于该基准时间的事务的标识,然后删除所查找到的事务的标识所对应的事务日志。

需要说明的是,事务的标识的生成时间,可以对应于该事务的标识存储于预设存储空间中,而并非事务的标识的组成部分。此外,事务的标识的生成时间,也可以是该标识的组成部分,即,属于组成该标识的一部分字段。对此不作限定。

可以理解,事务日志包括事务的标识和该事务的标识对应的状态标记。因此,事务的标识的写入时间,即为事务日志的写入时间。那么,删除事务日志,即为删除事务日志中包括的即为写入时间早于该基准时间的事务的标识和该事务的标识所对应的状态标记。那么,当在预设存储空间中对应写入的是事务的标识和待提交状态标记,这种情况下,事务日志中包括的状态标记,即为待提交状态标记。当在预设存储空间中对应写入的是事务的标识和中止状态标记,那么,事务日志中包括的状态标记,即为中止状态标记(比如,xid:abort,其中,xid为事务的标识,abort即表示中止状态)。

图4为一个实施例中清除分布式事务日志的原理示意图。参照图4,代理节点agent1~agent3可以分别从对应的参与者节点db1~db3中获取待提交的事务的标识子集合s1~s3,得到标识总集合s,然后从标识总集合s中选取生成时间最早的标识,得到基准tmin。预设存储空间中包括写入的事务日志,各个事务日志log1~logn分别有对应的写入时间t1~tn。将t1~tn分别与tmin进行比对,删除小于tmin的写入时间所对应的事务日志。比如,t1~t3皆小于tmin,则可以从预设存储空间中删除log1~logn。

在一个实施例中,如果无法从某个参与者节点中获取标识子集合,则可以暂停删除操作,以避免误删除的问题。比如,当参与者节点db2不可用,其他的参与者节点db的代理节点会发现无法与这个参与者节点db2建立连接,那么其他db会停止删除事务日志。当db2可用后,如果db2上有待提交的事务xid1,那么其他参与者节点db的代理节点则可以通过得到事务xid1的时间戳,在该事务xid1提交之前,保护其事务日志不被删除。

可以理解,假设基准时间为tmin,如果在tmin之前有某个参与者节点db1开始了事务xid1,但还没有预提交该事务xid1,那么,该事务对于参与者节点db1来说就不属于待提交的事务。因此,事务管理器一定还没有写入xid1的事务日志,即,还没有将事务的标识xid1和待提交状态标记作为事务日志写入预设存储空间中,xid1也就不会存在于当前待提交的事务的标识总集合中。后续,如果在预设存储空间中写入xid1的事务日志时,该写入时间必然大于当前待提交的事务的标识总集合中的基准时间tmin(因为tmin是已经产生的时间,后续新产生的写入时间必然晚于tmin),这样在清除事务日志时,就可以避免删除掉这个新写入的事务日志。而写入时间早于该基准时间tmin的事务日志,其所对应的事务必然已提交成功。这样一来,在清除事务日志时,就可以成功删除已提交成功的不必要的事务日志,又能够避免删除新写入的需要保留的事务日志。

为了便于理解,现用反证法进行举例说明。假设基准时间tmin是事务a的标识的生成时间,事务b的事务日志的写入时间早于基准时间tmin,那么,事务b的标识的生成时间必然早于基准时间tmin(因为对于同一事务而言,写入时间必然晚于生成时间,那么,在写入时间早于基准时间tmin的情况下,那么,其标识的生成时间必然早于基准时间tmin)。如果该事务b没有提交成功,那么,事务b的标识就必然存在于标识总集合中,由于事务b的标识的生成时间必然早于基准时间tmin,那么,从标识总集合的各标识的生成时间中选取的最早时间tmin,就不会是事务a的标识的生成时间了,与前面假设基准时间tmin是事务a的标识的生成时间矛盾。因此,假设不成立,反证得到写入时间早于基准时间tmin的事务b必然提交成功。而提交成功的事务b的事务日志保留已经没有意义,所以可以直接删除。从而能够证明,按照上述实施例的方法,在清除事务日志时,就可以成功删除已提交成功的不必要的事务日志,又能够避免删除新写入的需要保留的事务日志。

上述实施例中,将各参与者节点中的待提交事务的标识子集合,汇总得到待提交事务的标识总集合,从标识总集合中的所有标识的生成时间中选择最早生成时间,作为基准时间,这样一来,预设存储空间中存储的事务日志中,写入时间早于该基准时间的事务日志,必然是已完成提交的事务的日志,那么,这些事务日志就不需要保留了,因而可以进行删除。能够准确地确定出已完成提交的事务的事务日志,从而提高了事务日志清理的准确性。此外,清理事务日志,能够节省存储资源,提高系统性能。

在一个实施例中,该方法还包括:在生成每个事务的标识时,根据当前时间,生成用于表征标识的生成时间的时间戳;生成唯一标识事务的标识;标识的字段中包括时间戳。本实施例中,获取标识总集合中各标识的生成时间包括:解析标识总集合中各标识的字段,获取标识中的时间戳。

具体地,事务管理器在生成每个事务的标识时,可以根据当前时间生成一个时间戳,该时间戳,用于表征该标识的生成时间。事务管理器可以根据该时间戳生成该事务的唯一标识。其中,该事务的标识的字段中包括该时间戳。

那么,在获取标识总集合中各标识的生成时间时,事务管理器就可以解析标识总集合中各标识的字段,从中提取表征标识的生成时间的时间戳。事务管理器可以将标识总集合中提取的全部时间戳进行比对,选取最早的时间戳,作为基准时间。事务管理器可以从预设存储空间中,筛选所包括的时间戳早于该基准时间的事务的标识,然后,删除所筛选的事务的标识所对应的事务日志。

上述实施例中,将表征事务的标识的生成时间的时间戳作为一个组成事务的标识的字段,避免了另外针对事务的标识记录一个生成时间,节省了存储资源。此外,在获取生成时间时,直接从事务的标识中解析该时间戳,提高了效率。

图5为另一个实施例中分布式事务异常处理方法的流程示意图。参照图5,该方法具体包括以下步骤:

s502,事务管理器接收针对事务的开始指令,向确定执行该事务的参与者节点发送开始请求;接收各参与者节点返回的对该开始请求的应答消息。

s504,事务管理器向各参与者节点发送针对该事务的预提交请求;接收各参与者节点在本地针对该事务进行预提交处理后,返回的应答消息。当预提交处理成功时,则该事务进入待提交状态,属于待提交的事务,即执行步骤s506,当预提交处理失败时,则执行步骤s518。

s506,事务管理器获取待提交的事务的标识,向预设存储空间写入事务的标识和该事务的标识所对应的待提交状态标记。当针对预设存储空间的写入处理正常时,执行步骤s508;当写入处理超时或在执行写入处理过程中宕机时,执行步骤s510;当写入处理失败时,执行步骤s518。

s508,事务管理器向分布式系统中的参与者节点发送针对事务的第一提交请求。当参与者节点执行第一提交请求出现异常时,通过针对各参与者节点分别设置的代理节点,从预设存储空间中读取与事务的标识对应的待提交状态标记;通过各代理节点,根据待提交状态标记,向参与者节点发送第二提交请求。

在一个实施例中,参与者节点可以为区块链节点。

s510,通过各代理节点,从预设存储空间读取与事务的标识对应的待提交状态标记。当读取到与事务的标识对应的待提交状态标记,则执行步骤s512,当未读取到与事务的标识对应的待提交状态标记时,则执行步骤s514。

s512,通过各代理节点,向各参与者节点发送针对事务的第三提交请求。

s514,通过各代理节点,向预设存储空间中对应写入事务的标识和中止状态标记;再次从预设存储空间中读取与事务的标识对应的状态标记。当再次读取到的状态标记为待提交状态标记时,则执行步骤s516。当再次读取到的状态标记为中止状态标记时,则执行步骤s518。

s516,通过各代理节点,向分布式系统的参与者节点发送针对事务的第四提交请求。

s518,通过各代理节点,向各参与者节点发送回滚请求;回滚请求,用于指示各参与者节点回滚事务。

s520,通过各代理节点,从各参与者节点中分别获取待提交事务的标识子集合,得到标识总集合;解析标识总集合中各标识的字段,获取标识中的时间戳;选取最早的时间戳,得到基准时间;从预设存储空间中,删除写入时间早于基准时间的标识所对应的事务日志。

可以理解,本实施例中,事务管理器在生成每个事务的标识时,根据当前时间,生成用于表征标识的生成时间的时间戳;生成唯一标识事务的标识;标识的字段中包括时间戳。

上述分布式事务异常处理方法,针对待提交的事务,在向各参与者节点下发提交请求之前,事务管理器会向预设存储空间对应写入所述事务的标识和待提交状态标记,然后再向各参与者节点下发提交请求。这样一来,当任意一个参与者节点执行所述第一提交请求出现异常时,则可以从所述预设存储空间中读取与所述事务的标识对应的待提交状态标记,即可以获知该事务处于待提交状态,从而避免出现事务状态丢失的情况。进而,可以根据所述待提交状态标记,向所述参与者节点发送第二提交请求;所述第二提交请求,用于指示所述参与者节点再次提交所述事务。这种处理不需要改变参与者节点本身的性能,就可以避免在提交事务时丢失事务状态的情况,大大降低了成本。

此外,修改数据库本身的代码,会很大程度上引入新的问题,进而可能导致对数据库性能的降低。采用本申请各实施例中的分布式事务异常处理方法能够避免出现该问题,提高了数据库安全性和准确性

图6为一个实施例中的传统方法的时序简示图。图7为一个实施例中的本申请分布式事务异常处理方法的时序简示图。现结合图6和7来举例说明本申请各实施例中分布式事务异常处理方法相较于传统方法的区别点和有益效果。

参照图6和图7,db1和db2属于两个参与者节点。图6和图7中的可靠存储即为预设存储空间。参照图6,传统方法中,用户通过终端向事务管理器发送针对事务的开始指令(即,begin),并确定执行该事务的参与者节点db1和db2。事务管理器通过db1和db2提供的xa接口,向db1和db2发送开始请求(即,xastart)。db1和db2会针对开始请求向事务管理器发送应答。用户可以通过终端向事务管理器发送针对事务的提交指令。事务管理器可以通过db1和db2提供的xa接口,向db1和db2发送预提交请求(即,xapreparexid)。在db1和db2完成针对事务的预提交处理后,事务管理器可以向db1和db2发送提交请求(即,xacommitxid)。待db1和db2成功提交事务后,事务管理器可以发送提交成功的通知(即,图6和7中的“ok”)至用户所使用的终端。

参照图7,本申请实施例中的分布式事务异常处理方法中,在db1和db2完成针对事务的预提交处理后、且在向db1和db2下发提交请求之前,事务管理器可以将事务的标识和事务的标识所对应的待提交状态标记(即,xid:commit)对应持久化写入至预设存储空间中。当写入成功后,事务管理器可以向db1和db2下发提交请求(即,xacommitxid)。图7中,针对每个参与者节点,分别对应设置了相应的代理节点agent。当提交异常时,各代理节点agent可以从预设存储空间中读取与事务的标识对应的待提交状态标记,然后,各代理节点agent基于该待提交状态标记,向各自对应的参与者节点发送提交指令。可以理解,在向预设存储空间中写入事务的标识和待提交状态标记时,可能存在写入超时或写入过程中事务管理器宕机的情况,这种情况下,事务管理器就无法确定是否成功写入事务的标识和待提交状态标记至预设存储空间中。那么,代理节点agent则可以从自身对应的db1中的待提交事务的标识集合进行检测,以检测出未成功提交的事务的标识,然后从预设存储空间中读取与事务的标识对应的待提交状态标记。如果读取到,各代理节点agent基于该待提交状态标记,向各自对应的参与者节点发送提交指令。如果没有读取到,代理节点可以尝试向预设存储空间中对应写入该事务的标识和中止状态标记,然后再次从预设存储空间中读取该事务的标识对应的状态标记。如果再次读取时能够读取到待提交状态标记,则各代理节点agent基于该待提交状态标记,向各自对应的参与者节点发送提交指令。如果再次读取时读取到中止状态标记,则各代理节点agent可以向自身对应的参与者节点发送回滚请求(即rollback)。

如图8所示,在一个实施例中,提供了一种分布式事务异常处理装置800,该装置800包括:状态写入模块802、提交模块804以及状态读取模块806,其中:

状态写入模块802,用于获取待提交的事务的标识;向预设存储空间写入所述事务的标识和该事务的标识所对应的待提交状态标记。

提交模块804,用于向分布式系统中的参与者节点发送针对所述事务的第一提交请求。

状态读取模块806,用于当参与者节点执行所述第一提交请求出现异常时,则从所述预设存储空间中读取与所述事务的标识对应的待提交状态标记;

所述提交模块804还用于根据所述待提交状态标记,向所述参与者节点发送第二提交请求;所述第二提交请求,用于指示所述参与者节点提交所述事务。

在一个实施例中,当所述状态写入模块802针对预设存储空间的写入处理正常时,则通知所述提交模块804执行向分布式系统中的参与者节点发送针对所述事务的第一提交请求的步骤。

本实施例中,该装置800还包括:

回滚模块803,用于当所述状态写入模块802执行所述写入处理失败时,向各所述参与者节点发送回滚请求;所述回滚请求,用于指示各所述参与者节点回滚所述事务。

在一个实施例中,所述状态读取模块806还用于当所述状态写入模块802执行所述写入处理超时或在执行所述写入处理过程中宕机时,从所述预设存储空间中读取与所述事务的标识对应的待提交状态标记。

所述提交模块804还用于当读取到与所述事务的标识对应的待提交状态标记,则向各所述参与者节点发送针对所述事务的第三提交请求。

在一个实施例中,所述预设存储空间中存储的事务的标识仅对应一个状态标记。所述提交模块804还用于当所述状态读取模块806未读取到与所述事务的标识对应的待提交状态标记时,向所述预设存储空间中对应写入所述事务的标识和中止状态标记;再次从所述预设存储空间中读取与所述事务的标识对应的状态标记;当再次读取到的状态标记为待提交状态标记时,则向分布式系统中的参与者节点发送针对所述事务的第四提交请求。

在一个实施例中,所述提交模块804还用于当再次读取到的状态标记为中止状态标记时,则向各参与者节点发送回滚请求;所述回滚请求,用于指示各参与者节点回滚所述事务。

在一个实施例中,所述待提交的事务为预提交处理成功的事务。回滚模块803还用于向各所述参与者节点发送回滚请求;所述回滚请求,用于指示各所述参与者节点回滚所述事务。

在一个实施例中,所述状态读取模块806还用于通过针对各参与者节点分别设置的代理节点,从所述预设存储空间中读取与所述事务的标识对应的待提交状态标记。所述提交模块804还用于通过各代理节点,根据所述待提交状态标记,向所述参与者节点发送第二提交请求。

在一个实施例中,该装置还包括:

异常判定模块805,用于通过各所述代理节点,以预设时间间隔从与所述代理节点对应的参与者节点中,获取待提交事务的标识集合;当所述待提交的事务的标识在至少两次获取的标识集合中皆存在时,则判定参与者节点执行所述第一提交请求出现异常。

在一个实施例中,该装置800还包括:

事务日志清除模块808,用于从各参与者节点中分别获取待提交事务的标识子集合,得到标识总集合;获取标识总集合中各标识的生成时间;选取最早的生成时间,得到基准时间;从所述预设存储空间中,删除写入时间早于所述基准时间的标识所对应的事务日志。

如图9所示,在一个实施例中,该装置还包括:标识生成模块801、回滚模块803、异常判定模块805以及事务日志清除模块808,其中:

标识生成模块801,用于在生成每个事务的标识时,根据当前时间,生成用于表征所述标识的生成时间的时间戳;生成唯一标识所述事务的标识;所述标识的字段中包括所述时间戳。

本实施例中,事务日志清除模块808还用于解析标识总集合中各标识的字段,获取所述标识中的时间戳。

在一个实施例中,参与者节点为区块链节点。

图10为一个实施例中计算机设备的内部结构示意图。参照图10,该计算机设备可以图1中的事务管理器110。该计算机设备包括通过系统总线连接的处理器、存储器和网络接口。其中,存储器包括非易失性存储介质和内存储器。该计算机设备的非易失性存储介质可存储操作系统和计算机程序。该计算机程序被执行时,可使得处理器执行一种分布式事务异常处理方法。该计算机设备的处理器用于提供计算和控制能力,支撑整个计算机设备的运行。该内存储器中可储存有计算机程序,该计算机程序被处理器执行时,可使得处理器执行一种分布式事务异常处理方法。计算机设备的网络接口用于进行网络通信。

本领域技术人员可以理解,图10中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。

在一个实施例中,本申请提供的分布式事务异常处理装置可以实现为一种计算机程序的形式,计算机程序可在如图10所示的计算机设备上运行,计算机设备的非易失性存储介质可存储组成该分布式事务异常处理装置的各个程序模块,比如,图8所示的状态写入模块802、提交模块804以及状态读取模块806。各个程序模块所组成的计算机程序用于使该计算机设备执行本说明书中描述的本申请各个实施例的分布式事务异常处理方法中的步骤,例如,计算机设备可以通过如图8所示的分布式事务异常处理装置800中的状态写入模块802获取待提交的事务的标识;向预设存储空间写入所述事务的标识和该事务的标识对应的待提交状态标记。计算机设备可以通过提交模块804向分布式系统中的参与者节点发送针对所述事务的第一提交请求。计算机设备可以通过状态读取模块806当参与者节点执行所述第一提交请求出现异常时,则从所述预设存储空间中读取与所述事务的标识对应的待提交状态标记。计算机设备可以通过所述提交模块804根据所述待提交状态标记,向所述参与者节点发送第二提交请求;所述第二提交请求,用于指示所述参与者节点提交所述事务。

在一个实施例中,提供了一种计算机设备,包括存储器和处理器,存储器存储有计算机程序,计算机程序被处理器执行时,使得处理器执行上述分布式事务异常处理方法的步骤。此处分布式事务异常处理方法的步骤可以是上述各个实施例的分布式事务异常处理方法中的步骤。

在一个实施例中,提供了一种计算机可读存储介质,存储有计算机程序,计算机程序被处理器执行时,使得处理器执行上述分布式事务异常处理方法的步骤。此处分布式事务异常处理方法的步骤可以是上述各个实施例的分布式事务异常处理方法中的步骤。

需要说明的是,本申请各实施例中的“第一”、“第二”、“第三”和“第四”等仅用作区分,而并不用于大小、先后、从属等方面的限定。

应该理解的是,虽然本申请各实施例中的各个步骤并不是必然按照步骤标号指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,各实施例中至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。

本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一非易失性计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(rom)、可编程rom(prom)、电可编程rom(eprom)、电可擦除可编程rom(eeprom)或闪存。易失性存储器可包括随机存取存储器(ram)或者外部高速缓冲存储器。作为说明而非局限,ram以多种形式可得,诸如静态ram(sram)、动态ram(dram)、同步dram(sdram)、双数据率sdram(ddrsdram)、增强型sdram(esdram)、同步链路(synchlink)dram(sldram)、存储器总线(rambus)直接ram(rdram)、直接存储器总线动态ram(drdram)、以及存储器总线动态ram(rdram)等。

以上所述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。

以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1