具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本说明书相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本说明书的一些方面相一致的装置和方法的例子。
在本说明书使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书。在本说明书和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本说明书可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
目前,很多分布式事务都涉及到事务嵌套,例如,一个主事务内嵌套有若干个子事务。在执行这类分布式事务时,当主事务和所有子事务均提交成功时,才能确定分布式事务最终执行成功。
以电商平台为例,当用户确认收货时,电商平台需要将担保过渡户中的货款支付给商户。将货款支付给商户是一个主事务,该主事务内可嵌套两个子事务,一个子事务是在货款中扣除本次交易的佣金,并将佣金汇入电商平台的账号中,另一个子事务是将货款扣除佣金后汇入商户账号。
本说明书提供一种分布式事务的实现方案,当主事务回滚时,嵌套在主事务内提交成功的子事务无需回滚,当主事务再次发起事务操作时,子事务可直接向主事务返回提交成功的消息,无需重新执行事务提交,实现简单、效率较高。
在本说明书中,分布式事务的发起者在传入事务标识后,主事务开启。其中,所述发起者可以是应用、进程、服务等软件模块。所述事务标识全局唯一,可以是业务流水号,诸如订单编号、交易编号等。
在本说明书中,主事务开启后可执行相关的数据库操作,例如,记录事务状态、记录业务流水号等。
在本说明书中,主事务开启后还可将事务标识发送给各个子事务,各个子事务开启。
请参考图1,所述子事务在接收到所述事务标识后,可执行如下步骤:
步骤102,子事务在接收到所述主事务发送的事务标识后,判断所述事务标识对应的事务是否已提交成功。
在一个例子中,子事务可将所述事务标识插入目标幂等数据表中。
若插入成功,可说明所述目标幂等数据表中不存在所述事务标识对应的记录,即所述事务标识对应的事务尚未提交成功。
若插入失败,可说明所述目标幂等数据表中已存在所述事务标识对应的记录,即所述事务标识对应的事务已提交成功。
在另一个例子中,每个子事务都可维护对应的事务状态表,所述事务状态表可用于记录对应子事务处理过的事务标识及其事务状态。子事务可通过查询其事务状态表来确认所述事务标识对应的事务是否已提交成功。
若在事务状态表中查找到的事务状态是已提交,则可确认所述事务标识对应的事务已提交成功。
若在事务状态表中查找到的事务状态是已回滚,则可确认所述事务标识对应的事务未提交成功。
若事务状态表中未记录所述事务标识,则可确认所述事务标识对应的事务未提交成功。
当然,在实际应用中,还可以采用其他策略判断所述事务标识对应的事务是否已提交,本实施例在此不作特殊限制。
步骤104,若已提交成功,则向所述主事务返回提交成功的消息。
在本实施例中,若事务标识对应的事务已提交成功,则可说明所述事务标识对应的事务并非首次发起,通常是在之前事务提交过程中,当前子事务提交成功,但是主事务由于嵌套的其他子事务回滚等原因回滚,导致事务提交失败,现在事务发起者重新发起事务,主事务进而重新将事务标识发送给各个子事务。
在本实施例中,若事务标识对应的事务已提交成功,子事务无需重新提交,可直接向主事务返回提交成功的消息。
步骤106,若未提交成功,则提交所述事务标识对应的事务。
在本实施例中,若事务标识对应的事务未提交成功,则提交所述事务标识对应的事务,并可在提交成功后向主事务返回提交成功的消息。
由以上描述可以看出,本实施例在主事务回滚时,嵌套在主事务内提交成功的子事务无需回滚,当主事务再次发起事务操作时,子事务可直接向主事务返回提交成功的消息,无需重新执行事务提交,效率较高。并且,上述方案在子事务中加入通用性的判断逻辑即可实现,实现简单。
下面以主事务嵌套两个子事务,分别为子事务1和子事务2为例,对本说明书的具体实现过程进行详细描述。
在本实施例中,假设子事务通过事务状态表判断事务标识对应的事务是否已提交成功。所述事务状态表可以以事务标识为主键,还可以包括事务名称、事务状态、创建时间等字段。
其中,所述事务状态有两种,分别为已提交和已回滚。
当然,所述事务状态表还可以包括其他字段,本说明书对此不作特殊限制。
请参考图2,在本实施例提供的分布式事务的实现方法可以包括以下步骤:
步骤202,发起者在首次发起分布式事务时,传入事务标识。
步骤204,主事务开启,执行相关的数据库操作,并将所述事务标识发送给子事务1和子事务2。
步骤206,子事务1和子事务2查询自身事务状态表,确定表中不存在所述事务标识对应的记录。
在本实施例中,由于发起者是首次发起该分布式事务,各子事务尚未处理过该事务,因此事务状态表中不存在上述事务标识对应的记录。
步骤208,子事务1和子事务2提交所述事务标识对应的事务。
步骤210,子事务1提交成功,向主事务返回提交成功的消息,并更新事务状态表1。
在本实施例中,子事务1提交成功后,可将事务标识插入其事务状态表1,并将对应的事务状态更新为已提交。
步骤212,子事务2提交失败,执行回滚,并更新事务状态表2。
在本实施例中,子事务2提交失败后,可将事务标识插入其事务状态表2,并将对应的事务状态更新为已回滚。
当然,依据事务状态表的字段设置,子事务1和子事务2通常还可在对应的事务状态表中插入事务名称、创建时间等信息。
步骤214,主事务捕捉到子事务2回滚,执行回滚。
在本实施例中,主事务执行回滚后,可向发起者返回失败的消息,无需通知已提交成功的子事务1回滚。
步骤216,发起者重新发起事务,传入事务标识。
步骤218,主事务开启,执行相关的数据库操作,并将所述事务标识发送给子事务1和子事务2。
步骤220,子事务1查询事务状态表1,确认所述事务标识对应的事务已提交成功,向主事务返回提交成功的消息。
步骤222,子事务2查询事务状态表2,确认所述事务标识对应的事务未提交成功,提交所述事务标识对应的事务。
在本实施例中,子事务2查询事务状态表2,所述事务标识对应的事务状态是已回滚,进而可以确认所述事务标识对应的事务未提交成功,重新提交所述事务。
步骤224,子事务2提交成功,向主事务返回提交成功的消息,并更新事务状态表2。
步骤226,主事务提交成功,向发起者返回提交成功的消息。
在本实施例中,主事务在自身数据库操作成功,且接收到子事务1和子事务2发送的提交成功的消息时,可确定事务提交成功,进而向发起者返回提交成功的消息。
由以上描述可以看出,本实施例在主事务回滚时,嵌套在主事务内提交成功的子事务无需回滚,当主事务再次发起事务操作时,子事务可直接向主事务返回提交成功的消息,无需重新执行事务提交,效率较高。并且,上述方案在子事务中加入通用性的判断逻辑即可实现,实现简单。
可选的,在另一个例子中,事务状态表中还可包括修改时间。仍以图2所示的事务实现过程为例,在步骤224中,子事务2在将事务标识对应的事务状态更新为已提交时,还可将本次修改时间记录在修改时间字段中。值得注意的是,若在前述步骤222中,子事务2再次提交失败,则也会对事务状态表2进行更新,同样可记录修改时间。
在本例中,可按照预定的时间周期轮询事务状态表,根据修改时间判断修改时长是否超出预定时长,例如3小时,若超出,通常说明对应的事务异常,可发送报警信息。
在本例中,未避免事务状态表中的记录无限制增加,还可根据清除策略删除事务状态中的记录。例如,在每天零时删除前一天事务状态是已提交的记录等,本实施例对此不作特殊限制。
与前述分布式事务的实现方法的实施例相对应,本说明书还提供了分布式事务的实现装置的实施例。
本说明书分布式事务的实现装置的实施例可以应用在子事务参与者上,所述子事务参与者可以是终端、服务器等任何具有处理和存储能力的设备。装置实施例可以通过软件实现,也可以通过硬件或者软硬件结合的方式实现。以软件实现为例,作为一个逻辑意义上的装置,是通过其所在设备的处理器将非易失性存储器中对应的计算机程序指令读取到内存中运行形成的。从硬件层面而言,如图3所示,为本说明书分布式事务的实现装置所在设备的一种硬件结构图,除了图3所示的处理器、内存、网络接口、以及非易失性存储器之外,实施例中装置所在的设备通常根据该设备的实际功能,还可以包括其他硬件,对此不再赘述。
图4是本说明书一示例性实施例示出的一种分布式事务的实现装置的框图。
请参考图4,所述分布式事务的实现装置300可以应用在前述图3所示的子事务参与者设备中,包括有:成功判断单元301、消息返回单元302、事务提交单元303、状态更新单元304以及报警单元305。
其中,成功判断单元301,在接收到所述主事务发送的事务标识后,判断所述事务标识对应的事务是否已提交成功;
消息返回单元302,若已提交成功,则向所述主事务返回提交成功的消息;
事务提交单元303,若未提交成功,则提交所述事务标识对应的事务。
可选的,所述成功判断单元301:
在事务状态表中查找所述事务标识对应的事务状态,所述事务状态表记录所述子事务处理过的事务标识及其事务状态;
若查找到的事务状态是已提交,则确认所述事务标识对应的事务已提交成功;
若查找到的事务状态是已回滚,则确认所述事务标识对应的事务未提交成功;
若所述事务状态表中未记录所述事务标识,则确认所述事务标识对应的事务未提交成功。
状态更新单元304,在提交所述事务标识对应的事务后,根据提交结果和所述事务标识更新所述事务状态表。
可选的,所述事务状态表中还记录有事务状态修改时间;
所述装置还包括:
报警单元305,当所述事务状态修改时间距今时长超出预定时长时,发送报警信息。
可选的,所述成功判断单元301:
在目标幂等数据表中插入所述事务标识;
若插入失败,则确认所述事务标识对应的事务已提交成功。
上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本说明书方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
与前述分布式事务的实现方法的实施例相对应,本说明书还提供一种分布式事务的实现装置,该装置应用于子事务参与者设备中,可包括:处理器以及用于存储机器可执行指令的存储器。其中,处理器和存储器通常借由内部总线相互连接。在其他可能的实现方式中,所述设备还可能包括外部接口,以能够与其他设备或者部件进行通信。
在本实施例中,通过读取并执行所述存储器存储的与分布式事务的实现逻辑对应的机器可执行指令,所述处理器被促使:
在接收到所述主事务发送的事务标识后,判断所述事务标识对应的事务是否已提交成功;
若已提交成功,则向所述主事务返回提交成功的消息;
若未提交成功,则提交所述事务标识对应的事务。
可选的,在判断所述事务标识对应的事务是否已提交成功时,所述处理器被促使:
在事务状态表中查找所述事务标识对应的事务状态,所述事务状态表记录所述子事务处理过的事务标识及其事务状态;
若查找到的事务状态是已提交,则确认所述事务标识对应的事务已提交成功;
若查找到的事务状态是已回滚,则确认所述事务标识对应的事务未提交成功;
若所述事务状态表中未记录所述事务标识,则确认所述事务标识对应的事务未提交成功。
可选的,所述处理器还被促使:
在提交所述事务标识对应的事务后,根据提交结果和所述事务标识更新所述事务状态表。
可选的,所述事务状态表中还记录有事务状态修改时间;
所述处理器还被促使:
当所述事务状态修改时间距今时长超出预定时长时,发送报警信息。
可选的,在判断所述事务标识对应的事务是否已提交成功时,所述处理器被促使:
在目标幂等数据表中插入所述事务标识;
若插入失败,则确认所述事务标识对应的事务已提交成功。
与前述分布式事务的实现方法的实施例相对应,本说明书还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,该程序被处理器执行时实现以下步骤:
在接收到所述主事务发送的事务标识后,判断所述事务标识对应的事务是否已提交成功;
若已提交成功,则向所述主事务返回提交成功的消息;
若未提交成功,则提交所述事务标识对应的事务。
可选的,所述判断所述事务标识对应的事务是否已提交成功,包括:
在事务状态表中查找所述事务标识对应的事务状态,所述事务状态表记录所述子事务处理过的事务标识及其事务状态;
若查找到的事务状态是已提交,则确认所述事务标识对应的事务已提交成功;
若查找到的事务状态是已回滚,则确认所述事务标识对应的事务未提交成功;
若所述事务状态表中未记录所述事务标识,则确认所述事务标识对应的事务未提交成功。
可选的,还包括:
在提交所述事务标识对应的事务后,根据提交结果和所述事务标识更新所述事务状态表。
可选的,所述事务状态表中还记录有事务状态修改时间;
所述方法还包括:
当所述事务状态修改时间距今时长超出预定时长时,发送报警信息。
可选的,所述判断所述事务标识对应的事务是否已提交成功,包括:
在目标幂等数据表中插入所述事务标识;
若插入失败,则确认所述事务标识对应的事务已提交成功。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
以上所述仅为本说明书的较佳实施例而已,并不用以限制本说明书,凡在本说明书的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本说明书保护的范围之内。