分布式事务处理方法及装置的制造方法

文档序号:10624639阅读:272来源:国知局
分布式事务处理方法及装置的制造方法
【专利摘要】本申请提供一种分布式事务处理方法及装置,该方法包括:判断所述分布式事务各个事务分支的执行是否可以重试,并根据判断的结果对每个事务分支进行处理;当所述分布式事务的所有事务分支处理完成后,执行所述分布式事务的提交或回滚。根据本申请的技术方案,针对分布式事务配置可以重试的事务分支和不可重试的事务分支,对于可以重试的分支不立即执行,而是直接向服务器上报该分支执行成功的执行结果,从而较快的进入事务的全局提交或回滚阶段;事务提交阶段再执行可以重试的分支,异步推进分布式事务的提交,既保证了事务的成功率,又不影响事务的最终一致。
【专利说明】
分布式事务处理方法及装置
技术领域
[0001]本申请涉及分布式事务处理领域,尤其涉及一种分布式事务处理方法及装置。
【背景技术】
[0002]事务是一个不可分割的工作单位,一个分布式事务通常包含多个本地事务,各个本地事务要么都执行,要么都不执行,举例来说,假设数据库A上的操作1、数据库B上的操作2、数据库C上的操作3在一个分布式事务,传统的分布式事务处理上只有三个操作都执行成功,这个分布式事务才成功。然而,在很多实际业务中,三个操作的关键级别并不是一样的,有的要求立即成功,即,调用返回时已经成功,有的只要求最终成功。
[0003]现有的解决分布式事务问题的方案有:XA两阶段提交协议、三阶段提交协议等,然而,这些方案都不支持事务分支的重试级别配置。以其中应用最为广泛也最成熟的XA两阶段提交协议为例,两阶段提交中的第一阶段是表决阶段,所有参与者都将本事务能否成功的反馈发送给协调者;第二阶段是执行阶段,协调者根据所有参与者的反馈,如果收到的所有反馈都是成功,则通知所有参与者,步调一致地在所有分支上提交,如果收到的任一反馈是失败,则通知所有参与者在所有分支上回滚。
[0004]对XA协议来说,参与分布式事务的各个事务分支是平等的,不存在关键分支和非关键分支,这就造成了 XA协议在一些应用场景下的局限性。XA两阶段提交协议是一个阻塞协议,当一个节点在等待回复消息时进入阻塞状态,其他需要这些资源的事务需要等待。也就是说,如果一个事务逻辑上有N-1个重要分支和I个不重要分支(不需要立即成功的),当不重要分支迟迟未完成,所有分支都必须等待,N个分支的资源都没有释放,依赖任何一个资源的事务都无法继续。
[0005]举个例子,一个分布式事务包括操作1、操作2和操作3,其中,操作I和操作2要求必须立即成功,而操作3不要求立即成功,若不成功可以稍后重试,使用XA两阶段提交协议时,假如操作1、2在第一阶段表决为成功,但是由于某些原因引起操作3失败,XA只能认为事务失败,则操作1、2在第二阶段回滚。这对实际业务来说,并不是合理、有效的,在实际业务中,不应该因为一些不关键的操作而让主业务失败。
[0006]为了避免上面问题,XA有一种解决方案是把操作I和操作2放在一个事务中执行,这个事务执行成功了,再执行操作3,然而,如果操作3失败了,则必须用很多冗余的技术手段来保证重试和最终成功,而且无法做到严格一致,例如,如果这个事务成功后,操作3还没执行就宕机了,则操作3永远无法执行,而操作1、2也无法回滚,将会造成数据的不一致。
[0007]综上所述,需要提出一种分布式事务的处理方案,以解决上述的问题。

【发明内容】

[0008]本申请的主要目的在于提供一种分布式事务处理方法及装置,以解决现有技术存在的解决分布式事务中由于事务分支级别都平等而导致不重要的事务分支的执行影响事务的全局提交的问题,其中:
[0009]本申请的一个方面提供了一种分布式事务处理方法,包括:判断所述分布式事务各个事务分支的执行是否可以重试,并根据判断的结果对每个事务分支进行处理;当所述分布式事务的所有事务分支处理完成后,执行所述分布式事务的提交或回滚。
[0010]根据本申请,在该方法中,根据判断的结果对每个事务分支进行处理,包括:如果所述事务分支的执行可以重试,则向服务器注册所述事务分支,并向服务器上报所述事务分支执行成功的执行结果;如果所述事务分支的执行不可重试,则向服务器注册所述事务分支,并执行所述事务分支,向服务器上报所述事务分支的执行结果。
[0011]根据本申请,在该方法中,执行所述分布式事务的提交或回滚,包括:根据接收到的服务器发送的提交所述分布式事务的命令,执行所述分布式事务的提交;或者根据接收到的服务器发送的回滚所述分布式事务的命令,执行所述分布式事务的回滚。
[0012]根据本申请,在该方法中,执行所述分布式事务的提交,包括:对于所述分布式事务中可以重试的事务分支,根据所述事务分支创建子事务,并执行所创建的子事务,当所述子事务执行成功时,提交所述子事务;对于所述分布式事务中不可重试的事务分支,提交所述事务分支,并清理相应的事务分支日志。
[0013]根据本申请,在该方法中,执行所创建的子事务,包括:如果所述子事务执行失败,则对所述子事务进行重试,直到所述子事务执行成功。
[0014]根据本申请,在该方法中,还包括:向服务器上报各个事务分支的提交结果。
[0015]根据本申请,在该方法中,执行所述分布式事务的回滚,包括:对于所述分布式事务中不可重试的事务分支,执行所述事务分支的回滚;对于所述分布式事务中可以重试的事务分支,清除相应的事务分支日志。
[0016]本申请的另一个方面提供了一种分布式事务处理装置,包括:判断模块,用于判断所述分布式事务各个事务分支的执行是否可以重试;处理模块,用于根据判断的结果对每个事务分支进行处理;执行模块,用于当所述分布式事务的所有事务分支处理完成后,执行所述分布式事务的提交或回滚。
[0017]根据本申请,在该装置中,所述处理模块,进一步用于:如果所述事务分支的执行可以重试,则向服务器注册所述事务分支,并向服务器上报所述事务分支执行成功的执行结果;如果所述事务分支的执行不可重试,则向服务器注册所述事务分支,并执行所述事务分支,向服务器上报所述事务分支的执行结果。
[0018]根据本申请,在该装置中,所述执行模块,包括:提交模块,用于根据接收到的服务器发送的提交所述分布式事务的命令,执行所述分布式事务的提交;或者回滚模块,用于根据接收到的服务器发送的回滚所述分布式事务的命令,执行所述分布式事务的回滚。
[0019]根据本申请,在该装置中,所述提交模块,包括:第一提交子模块,用于对于所述分布式事务中可以重试的事务分支,根据所述事务分支创建子事务,并执行所创建的子事务,当所述子事务执行成功时,提交所述子事务;第二提交子模块,用于对于所述分布式事务中不可重试的事务分支,提交所述事务分支,并清理相应的事务分支日志。
[0020]根据本申请,在该装置中,所述第一提交子模块,进一步用于:如果所述子事务执行失败,则对所述子事务进行重试,直到所述子事务执行成功。
[0021 ] 根据本申请,在该装置中,还包括:上报模块,用于向服务器上报各个事务分支的提交结果。
[0022]根据本申请,在该装置中,所述回滚模块,包括:第一回滚子模块,用于对于所述分布式事务中不可重试的事务分支,执行所述事务分支的回滚;第二回滚子模块,用于对于所述分布式事务中可以重试的事务分支,清除相应的事务分支日志。
[0023]与现有技术相比,根据本申请的技术方案,针对分布式事务通过配置可以重试的事务分支和不可重试的事务分支,将不要求立即成功的事务分支设置为可以重试的分支,在处理分布式事务时,对于可以重试的事务分支,不立即执行,而是直接向服务器上报该分支执行成功的执行结果,对于不可重试的事务分支,执行后向服务器上报该分支的执行结果,从而较快的进入全局事务提交或回滚阶段。在事务分支提交阶段,执行分布式事务中可以重试的事务分支,异步推进分布式事务的提交,既保证了事务的成功率,又不影响事务的最终一致。
【附图说明】
[0024]此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
[0025]图1是本申请实施例的分布式事务处理方法的流程图;
[0026]图2是根据本申请一个实施例的执行根据可以重试的分支创建的子事务的流程图;
[0027]图3是根据本申请一个实施例的分布式事务处理方法的流程图;
[0028]图4是根据本申请一个实施例的对分布式事务的单个事务分支进行提交的流程图;以及
[0029]图5是根据本申请实施例的分布式事务处理装置的结构框图。
【具体实施方式】
[0030]本申请的主要思想在于,在分布式事务中配置可以重试的事务分支(不要求立即成功的事务分支)和不可重试的事务分支(要求立即成功的事务分支),从而根据事务分支是否可以重试对各个分支进行相应的处理,对于可以重试的事务分支,不立即执行,而是直接向服务器上报该分支执行成功的执行结果,对于不可重试的事务分支,执行后向服务器上报该分支的执行结果,从而较快的进入全局事务提交或回滚阶段,并在全局提交或回滚阶段执行可以重试的事务分支,解决分布式事务中由于不同的事务分支级别平等而导致不重要的事务分支影响全局提交的问题。
[0031]为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
[0032]在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
[0033]内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
[0034]计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
[0035]还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
[0036]本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
[0037]根据本申请的实施例,提供了一种分布式事务的处理方法。
[0038]参考图1,图1是本申请实施例的分布式事务的处理方法的流程图。
[0039]在步骤SllO处,判断所述分布式事务的各个事务分支的执行是否可以重试,并根据判断的结果对每个事务分支进行处理。
[0040]其中,每个事务分支的执行是否可以重试,例如可以根据该事务分支是否要求立即成功来进行判断,如果该事务分支要求立即成功,则该事务分支的执行不可以重试;如果该事务分支不要求立即成功,则该事务分支的执行可以重试。
[0041]例如,假设将“账户A向账户B转账”作为一个分布式事务,则需要在三个数据库上进行写操作(也即是说,该事务可以分成三个事务分支),分别为:
[0042]1、在数据库I上给账户A扣掉预定金额;
[0043]2、在数据库2上给账户B加上相应金额;
[0044]3、在数据库3上进行转账汇总。
[0045]其中,操作I和操作2要求必须立即成功,为不可重试的事务分支,而操作3并不要求立即成功,可以稍后重试,为可重试的事务分支。类似操作3这样进行数据汇总或统计的操作,只需要在数据库中写入一条记录,执行失败大多是由于网络故障等原因,因此,这样的事务分支在一定程度上是可以保证会必然成功,可以将这类只要求最终成功,而不要求立即成功,且在一定程度上能够保证其一定会成功的事务分支设置为可以重试的事务分支。
[0046]根据本申请的实施例,可以预先配置事务分支是否可以重试的判断规则,例如,预先根据大量的历史数据配置分支可以重试的各种情形,配置判断分支是否可以重试的判断规则,从而可以根据预先配置的判断规则,判断所述分布式事务的各个事务分支是否可以重试。
[0047]需要说明的是,各个事务分支可能需要在不同的数据库中执行,对分布式事务的各个事务分支是否可以重试的判断以及根据判断结果进行处理可以异步进行,也可以并行地进行。
[0048]根据本申请的一个实施例,根据判断的结果对每个事务分支进行处理,可以包括以下的处理方式:
[0049](I)如果所述事务分支的执行可以重试,则向服务器注册所述事务分支,并向服务器上报所述事务分支执行成功的执行结果。
[0050]对于可以重试的事务分支,由于不要求立即成功,可以重试,因此,在一定才程度上保证了该事务分支必然能够执行成功,则向服务器注册该事务分支后,不去执行该分支,而直接向服务器上报该分支执行成功的执行结果。
[0051](2)如果所述事务分支的执行不可重试,则向服务器注册所述事务分支,并执行所述事务分支,向服务器上报所述事务分支的执行结果。
[0052]对于不可重试的事务分支,向服务器注册该事务分支后,去执行该分支,并在执行该分支后向服务器上报该分支的执行结果,即,向服务器上报该分支执行成功或执行失败的执行结果。
[0053]通过上述处理方式,在处理分布式事务时,对于可以重试的事务分支,不立即执行,而是直接向服务器上报该分支执行成功的执行结果,对于不可重试的事务分支,执行后向服务器上报该分支的执行结果,从而能够较快地进入分布式事务的提交阶段。
[0054]在步骤S120处,当所述分布式事务的所有事务分支处理完成后,执行所述分布式事务的提交或者回滚。
[0055]根据本申请的实施例,向服务器上报所有分支的执行结果后,服务器端作为协调者,根据接收到的各个事务分支的执行结果决定发起该分布式事务的提交或回滚,具体地,如果所述分布式事务的所有的事务分支的执行结果都是执行成功,则确定对所述分布式事务进行提交,如果所有的事务分支中至少存在一个执行结果为执行失败的事务分支,则确定对所述分布式事务进行回滚。具体而言,服务器确定了对分布式事务进行提交或回滚后,向各个事务分支发送分支提交命令或回滚命令,发起全局事务的提交或回滚。因此,可以根据接收到的服务器发送的提交所述分布式事务的命令,执行所述分布式事务的提交;或者根据接收到的服务器发送的回滚所述分布式事务的命令,执行所述分布式事务的回滚。也即是说,如果接收到的服务器发送的提交所述分布式事务的命令,则执行所述分布式事务的提交;如果接收到的服务器发送的回滚所述分布式事务的命令,则执行所述分布式事务的回滚。
[0056]根据本申请的一个实施例,在接收到服务器发送的提交所述分布式事务的命令的情况下,执行所述分布式事务的提交的步骤可以包括以下情形:
[0057](I)对于所述分布式事务中可以重试的事务分支,根据所述事务分支创建子事务,并执行所创建的子事务,当所述子事务执行成功时,提交所述子事务。如果当前处理的分支可以重试,则针对该事务创建一个子事务,并执行该子事务,其中,执行所创建的子事务时,如果所述子事务执行失败,则对所述子事务进行重试,直到所述子事务执行成功。具体而言,由于可以重试的事务分支为不要求立即成功,且为必然会成功的分支,因此,如果所述子事务执行失败,则可以对所述子事务进行异步重试,直到所述子事务执行成功,则提交该子事务。
[0058]参考图2,图2是根据本申请一个实施例的执行根据可以重试的分支创建的子事务的流程图。
[0059]更具体而言,执行一个子事务可以包括以下的步骤:
[0060]步骤S210,执行该子事务的一个分支。其中,每个子事务可能包括多个事务分支。
[0061]步骤S220,判断所执行的分支是否执行成功。如果执行成功,则返回步骤S210,继续执行该子事务的其他分支;如果执行失败,执行步骤S230。
[0062]步骤S230,向服务器发送该分支的执行数据。该执行数据例如可以为该分支执行成功后的最终结果数据,例如,如果为SQL事务,则解释所执行的分支的SQL语句并向服务器发送,由服务器接收到该执行数据,发起该分支的异步重试,该分支可能被服务器发送到当前执行者重新执行,也可能被服务器发送到其他执行者执行,但该分支最终会执行成功。
[0063]步骤S240,判断该子事务是否存在未执行的分支,如果存在,则返回步骤S210继续执行尚未执行的分支;如果不存在未执行的分支,则该子事务执行完毕(执行成功),进行步骤S250。
[0064]步骤S250,提交所述子事务。
[0065](2)对于所述分布式事务中不可重试的事务分支,提交所述事务分支,并清理相应的事务分支日志。
[0066]对于不可重试的分支,由于已经真正执行过,如果接收到服务器发送的提交命令,表明该分布式事务中不可重试的分支都执行成功,因此,可以直接提交该事务分支,并清理该事务分支的相应的事务分支日志。
[0067]通过执行步骤S120,在事务分支提交阶段,执行分布式事务中可以重试的事务分支,异步推进分布式事务的提交,既保证了事务的成功率,又不影响事务的最终一致。
[0068]根据本申请的一个实施例,该方法还可以包括:向服务器上报各个事务分支的提交结果的步骤,也即是说,提交了某个事务分支之后向服务器上报该分支的提交结果,具体而言,在接收到服务器发送的提交所述分布式事务的命令的情况下,表明该分布式事务的所有分支都执行成功了(不可重试的分支执行成功,可重试的分支必然成功),因此,针对每个事务分支向服务器上报的提交结果,为该事务分支提交成功的提交结果。
[0069]根据本申请的一个实施例,在接收到服务器发送的回滚所述分布式事务的命令的情况下,执行所述分布式事务的回滚的步骤可以包括以下情形:
[0070](I)对于所述分布式事务中不可重试的事务分支,执行所述事务分支的回滚。
[0071]对于不可重试的事务分支,在前述步骤中已经真正的执行,在接收到服务器发送的回滚所述分布式事务的命令的情况下,可以根据相应的事务分支日志进行该事务分支的回滚。
[0072](2)对于所述分布式事务中可以重试的事务分支,清除相应的事务分支日志。
[0073]对于可以重试的事务分支,由于并没有真正执行,因此,在接收到服务器发送的回滚所述分布式事务的命令的情况下,可以清除相应的事务分支日志。
[0074]在实际应用中,本申请的分布式事务处理方法可以应用于由客户端发起的分布式事务中,例如,客户端根据用户进行的操作开启一个分布式事务(客户端向服务器注册全局事务),并处理该分布式事务,服务器作为分布式事务的协调者,根据各个事务分支的执行结果发起事务的全局提交或全局回滚,也就是说,向分布式事务的各个事务分支发送分支提交命令或分支回滚命令。
[0075]以下以一个具体实施例对本申请的分布式事务处理方法进行详细描述。
[0076]参考图3,图3是根据本申请一个实施例的分布式事务处理方法的流程图。
[0077]步骤S310,开启分布式事务。
[0078]由客户端根据用户进行的操作,向服务器注册全局事务,服务器为该全局事务分配事务标识ID。例如,用户发起“账户A向账户B转账”,则向服务器注册“账户A向账户B转账”的全局事务。
[0079]步骤S320,处理一个事务分支,判断所处理的事务分支的执行是否可以重试。
[0080]其中,如果所述事务分支的执行可以重试,则执行步骤S330;如果所述事务分支的执行不可重试,则执行步骤S340,需要说明的是,根据不同类型的分布式事务的执行要求,各个事务分支的处理可以并行处理,或者以预定的顺序进行处理。
[0081]步骤S330,如果所述事务分支的执行可以重试,则向服务器注册所述事务分支,并向服务器上报所述事务分支执行成功的执行结果,接下来进行步骤S350。
[0082]步骤S340,如果所述事务分支的执行不可重试,则向服务器注册所述事务分支,并执行所述事务分支,向服务器上报所述事务分支的执行结果,接下来进行步骤S350。
[0083]在对分布式事务的各个事务分支分别执行上述步骤S320?S340直到完成对该分布式事务的所有事务分支的处理。
[0084]步骤S350,判断是否存在未处理的事务分支。
[0085]如果存在未处理的事务分支,则返回步骤S320,继续处理未处理的分支;如果不存在未处理的分支,则执行步骤S360。
[0086]步骤S360,接收服务器返回的提交命令或者回滚命令,执行分布式事务的提交或者回滚。
[0087]将所有事务分支的执行结果向服务器上报后,服务器作为分布式事务的协调者,根据各个事务分支的执行结果决定对该分布式事务发起全局提交或全局回滚。服务器可以向分布式事务的各个事务分支分别发送提交命令或回滚命令,接收到服务器返回的事务分支提交命令或事务分支回滚命令,执行各个事务分支的提交或者回滚。
[0088]图4是根据本申请一个实施例的对分布式事务的单个事务分支进行提交的流程图。如图4所示,根据本申请的一个实施例,当接收到服务器的提交命令时,假设该分支为可以重试的分支,则对单个分支进行提交可以包括以下步骤:
[0089]步骤S410,接收到服务器发送的分支提交命令。
[0090]步骤S420,根据该事务分支创建一个子事务。
[0091]步骤S430,执行所创建的子事务,直到该子事务执行成功。
[0092]步骤S440,提交所述事务分支。
[0093]步骤S450,向服务器上报所述分支提交成功的提交结果。
[0094]假设该分支为不可重试的分支,由于不可重试的分支已经真正执行,并且执行成功,则在接收到服务器发送的分支提交命令后,可以直接提交所述事务分支,并向服务器上报所述分支提交成功的提交结果。也即是说,按照步骤S410—步骤S440—步骤S450的顺序执行。
[0095]根据上述实施例中的详细描述,可见本申请在处理分布式事务时,对于可以重试的事务分支,不立即执行,而是直接向服务器上报该分支执行成功的执行结果,对于不可重试的事务分支,执行后向服务器上报该分支的执行结果,从而较快的进入全局事务提交或回滚阶段。在事务分支提交阶段,执行分布式事务中可以重试的事务分支,异步推进分布式事务的提交,既保证了事务的成功率,又不影响事务的最终一致。
[0096]下面沿用步骤SllO中举例,详细说明本申请的方法的执行。
[0097]用户在客户端发起“账户A向账户B转账”的操作,根据用户进行的操作向服务器注册全局事务;服务器会为该全局事务分配事务标识ID。“账户A向账户B转账”需要在三个数据库上进行写操作,也即是说,该事务可以分成三个事务分支:
[0098]1、在数据库I上给账户A扣掉预定金额;
[0099]2、在数据库2上给账户B加上相应金额;
[0100]3、在数据库3上进行转账汇总。
[0101]其中,事务分支I和事务分支2要求必须立即成功,为不可重试的事务分支,而事务分支3只要求最终成功,为可以重试的事务分支。
[0102]处理事务分支1,该分支不可重试,因此,向服务器注册事务分支I后执行该分支,即,执行在数据库I上给账户A扣掉预定金额的操作,假设事务分支I执行成功,则向服务器上报事务分支I执行成功的执行结果;
[0103]处理事务分支2,事务分支2的处理可以与事务分支I的处理并行进行,由于事务分支2也是不可重试的分支,因此,向服务器注册事务分支2并执行该分支,即,执行在数据库2上给账户B加上相应金额的操作,假设事务分支2也执行成功,则向服务器上报事务分支2执行成功的执行结果;
[0104]处理事务分支3,事务分支3可以重试,因此在处理该分支时,向服务器注册该分支后不立即执行,而是直接向服务器上报该分支执行成功的执行结果。
[0105]各个事务分支处理完成后,服务器根据所有分支的执行结果,确定对该分布式事务进行提交或回滚,此时服务器接收到的所有分支的执行结果都是成功,因此确定对该分布式事务进行提交,则服务器返回对该分布式事务进行提交的命令,即,向各个分支发送分支提交命令,各个分支根据提交命令进行分支提交。其中,事务分支I和事务分支2已经成功,可以直接提交,事务分支3为可以重试的分支,因此,创建根据该分支创建该分布式事务的一个子事务,即创建“在数据库3上进行转账汇总”的子事务,并执行该子事务。执行该子事务时,如果执行不成功可以由服务器发起异步重试,直到执行成功后进行提交。
[0106]通过以上的实例可以看出,本申请通过将事务分支I和2配置为不可重试级别,将事务分支3配置为可以重试级别,在处理各个分支时,只对要求立即成功的事务分支1、2真正地执行,对不要求立即成功的事务分支3不立即执行,而是直接上报执行成功的结果,使分布式事务的处理提前进入提交阶段,并且,将事务分支3创建为该分布式事务的一个子事务,使事务分支3既可以异步重试,又与事务分支1、2保持在一个分布式事务中,保证了事务分支3与事务分支1、2的最终一致性。
[0107]本申请还提供了一种分布式事务的处理装置。
[0108]图5示意性地示出了根据本申请一个实施例的分布式事务的处理装置的结构框图。
[0109]根据本申请的一个实施例,该分布式事务处理装置500包括:判断模块510、处理模块520以及执行模块530。
[0110]判断模块510,用于判断所述分布式事务各个事务分支的执行是否可以重试。
[0111]处理模块520,用于根据判断的结果对每个事务分支进行处理。
[0112]执行模块530,用于当所述分布式事务的所有事务分支处理完成后,执行所述分布式事务的提交或回滚。
[0113]根据本申请的一个实施例,所述处理模块520可以进一步用于:如果所述事务分支的执行可以重试,则向服务器注册所述事务分支,并向服务器上报所述事务分支执行成功的执行结果;如果所述事务分支的执行不可重试,则向服务器注册所述事务分支,并执行所述事务分支,向服务器上报所述事务分支的执行结果。
[0114]根据本申请的一个实施例,所述执行模块530可以包括:提交模块,用于根据接收到的服务器发送的提交所述分布式事务的命令,执行所述分布式事务的提交;或者回滚模块,用于根据接收到的服务器发送的回滚所述分布式事务的命令,执行所述分布式事务的回滚。
[0115]根据本申请的一个实施例,所述提交模块,包括:第一提交子模块,用于对于所述分布式事务中可以重试的事务分支,根据所述事务分支创建子事务,并执行所创建的子事务,当所述子事务执行成功时,提交所述子事务;第二提交子模块,用于对于所述分布式事务中不可重试的事务分支,提交所述事务分支,并清理相应的事务分支日志。
[0116]根据本申请的一个实施例,所述第一提交子模块可以进一步用于:如果所述子事务执行失败,则对所述子事务进行重试,直到所述子事务执行成功。
[0117]根据本申请的一个实施例,该装置500还可以包括:上报模块,用于向服务器上报各个事务分支的提交结果。
[0118]根据本申请的一个实施例,所述回滚模块包括:第一回滚子模块,用于对于所述分布式事务中不可重试的事务分支,执行所述事务分支的回滚;第二回滚子模块,用于对于所述分布式事务中可以重试的事务分支,清除相应的事务分支日志。
[0119]由于本实施例的装置所实现的功能基本相应于前述图1至图4所示的方法实施例,故本实施例的描述中未详尽之处,可以参见前述实施例中的相关说明,在此不做赘述。
[0120]以上所述仅为本申请的实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。
【主权项】
1.一种分布式事务处理方法,其特征在于,包括: 判断所述分布式事务各个事务分支的执行是否可以重试,并根据判断的结果对每个事务分支进行处理; 当所述分布式事务的所有事务分支处理完成后,执行所述分布式事务的提交或回滚。2.根据权利要求1所述的方法,其特征在于,根据判断的结果对每个事务分支进行处理,包括: 如果所述事务分支的执行可以重试,则向服务器注册所述事务分支,并向服务器上报所述事务分支执行成功的执行结果; 如果所述事务分支的执行不可重试,则向服务器注册所述事务分支,并执行所述事务分支,向服务器上报所述事务分支的执行结果。3.根据权利要求2所述的方法,其特征在于,执行所述分布式事务的提交或回滚,包括: 根据接收到的服务器发送的提交所述分布式事务的命令,执行所述分布式事务的提交; 或者 根据接收到的服务器发送的回滚所述分布式事务的命令,执行所述分布式事务的回滚。4.根据权利要求3所述的方法,其特征在于,执行所述分布式事务的提交,包括: 对于所述分布式事务中可以重试的事务分支,根据所述事务分支创建子事务,并执行所创建的子事务,当所述子事务执行成功时,提交所述子事务; 对于所述分布式事务中不可重试的事务分支,提交所述事务分支,并清理相应的事务分支日志。5.根据权利要求4所述的方法,其特征在于,执行所创建的子事务,包括: 如果所述子事务执行失败,则对所述子事务进行重试,直到所述子事务执行成功。6.根据权利要求4所述方法,其特征在于,还包括:向服务器上报各个事务分支的提交结果。7.根据权利要求3所述的方法,其特征在于,执行所述分布式事务的回滚,包括: 对于所述分布式事务中不可重试的事务分支,执行所述事务分支的回滚; 对于所述分布式事务中可以重试的事务分支,清除相应的事务分支日志。8.一种分布式事务处理装置,其特征在于,包括: 判断模块,用于判断所述分布式事务各个事务分支的执行是否可以重试; 处理模块,用于根据判断的结果对每个事务分支进行处理; 执行模块,用于当所述分布式事务的所有事务分支处理完成后,执行所述分布式事务的提交或回滚。9.根据权利要求8所述的装置,其特征在于,所述处理模块,进一步用于: 如果所述事务分支的执行可以重试,则向服务器注册所述事务分支,并向服务器上报所述事务分支执行成功的执行结果; 如果所述事务分支的执行不可重试,则向服务器注册所述事务分支,并执行所述事务分支,向服务器上报所述事务分支的执行结果。10.根据权利要求9所述的装置,其特征在于,所述执行模块,包括: 提交模块,用于根据接收到的服务器发送的提交所述分布式事务的命令,执行所述分布式事务的提交; 或者 回滚模块,用于根据接收到的服务器发送的回滚所述分布式事务的命令,执行所述分布式事务的回滚。11.根据权利要求10所述的装置,其特征在于,所述提交模块,包括: 第一提交子模块,用于对于所述分布式事务中可以重试的事务分支,根据所述事务分支创建子事务,并执行所创建的子事务,当所述子事务执行成功时,提交所述子事务; 第二提交子模块,用于对于所述分布式事务中不可重试的事务分支,提交所述事务分支,并清理相应的事务分支日志。12.根据权利要求11所述的装置,其特征在于,所述第一提交子模块,进一步用于:如果所述子事务执行失败,则对所述子事务进行重试,直到所述子事务执行成功。13.根据权利要求11所述装置,其特征在于,还包括: 上报模块,用于向服务器上报各个事务分支的提交结果。14.根据权利要求10所述的装置,其特征在于,所述回滚模块,包括: 第一回滚子模块,用于对于所述分布式事务中不可重试的事务分支,执行所述事务分支的回滚; 第二回滚子模块,用于对于所述分布式事务中可以重试的事务分支,清除相应的事务分支日志。
【文档编号】G06F17/30GK105988862SQ201510059686
【公开日】2016年10月5日
【申请日】2015年2月4日
【发明人】姜宇
【申请人】阿里巴巴集团控股有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1