发明内容
本申请实施例的目的在于提供一种避免出现事务中间状态的分布式事务一致性实现方法及装置,以达到及时保证分布式事务一致性的目的。
为达到上述目的,一方面,本申请实施例提供了一种分布式事务一致性实现方法,包括以下步骤:
获取发起方发起的事务启动请求;
为所述事务启动请求分配事务号及数据库连接,并向所述发起方返回所述事务号;
在收到所述发起方调用各个参与方的调用请求时,基于所述调用请求中携带的事务号将所述调用请求路由至所述数据库连接中,以根据对应的调用请求执行相应的数据库操作;
在收到所述发起方的事务提交请求时,基于所述事务提交请求中携带的事务号将所述事务提交请求路由至所述数据库连接中,以执行事务提交。
另一方面,本申请实施例还提供了一种分布式事务一致性实现装置,包括:
事务启动请求获取模块,用于获取发起方发起的事务启动请求;
事务启动请求启动模块,用于为所述事务启动请求分配事务号及数据库连接,并向所述发起方返回所述事务号;
调用请求处理模块,用于在收到所述发起方调用各个参与方的调用请求时,基于所述调用请求中携带的事务号将所述调用请求路由至所述数据库连接中,以根据对应的调用请求执行相应的数据库操作;
提交请求处理模块,用于在收到所述发起方的事务提交请求时,基于所述事务提交请求中携带的事务号将所述事务提交请求路由至所述数据库连接中,以执行事务提交。
本申请实施例中,从事务请求到事务开启,再到发起方调用各个参与方,最后到事务提交,整个流程为一个完成的事务,发起方对所有参与方的调用是该事务的一部,只有发起方对所有参与方的成功执行完毕后,发起方才会发出事务提交请求,而只有事务提交成功,所有的调用才会生效,因此,本申请实施例不会存在一部分调用成功另一部分调用失败的中间状态,要么事务成功,要么事务失败,从而及时保证了分布式事务一致性。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚明白,下面结合实施例和附图,对本申请实施例做进一步详细说明。在此,本申请实施例的示意性实施例及其说明用于解释本申请实施例,但并不作为对本申请实施例的限定。
下面结合附图,对本申请实施例的具体实施方式作进一步的详细说明。
参考图1所示,本申请实施例的分布式事务一致性实现方法包括以下步骤:
步骤S101、获取发起方发起的事务启动请求。
一般的,所述的事务启动请求为开启分布式事务的请求。
步骤S102、为所述事务启动请求分配事务号及数据库连接,并向所述发起方返回所述事务号。
本申请实施例中,当收到发起方发起的事务启动请求时,可根据预设的事务号生成规则为所述事务启动请求生成一个事务号,并分配对应的数据库连接,从而开启事务。也就说,分配的事务号与分配的数据库连接是绑定的,以供后续数据库操作之用。其中,所述事务号是全局唯一的事务号,用来唯一识别一个事务。
事务开启后,应将生成的事务号返回给所述发起方,以供所述发起方在后续流程中使用。
步骤S103、在收到所述发起方调用各个参与方的调用请求时,基于所述调用请求中携带的事务号将所述调用请求路由至所述数据库连接中,以根据对应的调用请求执行相应的数据库操作。
在一个分布式事务中,参与方通常有多个(比如在一个订单事务中,订单系统作为发起方,其可能需要调用积分系统,可能需要调用电子优惠券系统,还可能需要调用支付系统等等),发起方可以按照预先设定的业务逻辑调用各个参与方,并在其发起的每个调用请求中携带所述事务号。本申请实施例的发起方调用各个参与方的场景中,所有的数据库操作均携带事务号。
本申请实例中,所述事务号不仅可以用来唯一识别一个事务,还可以用作路由标识,因此,基于所述调用请求中携带的事务号,可将所述调用请求路由至所述数据库连接中。
步骤S104、在收到所述发起方的事务提交请求时,基于所述事务提交请求中携带的事务号将所述事务提交请求路由至所述数据库连接中,以执行事务提交。
本申请实例中,从事务请求到事务开启,再到发起方调用各个参与方,最后到事务提交,整个流程为一个完成的事务,因此,步骤S103中所述的数据库操作,只有在事务成功提交后才能生效。当然,只有步骤S103中所述的数据库操作均完成后,才可能接收到所述发起方的事务提交请求。
在本申请的一个实施例中,分布式事务一致性实现方法还可以包括:
当所述数据库操作发生异常(比如数据库操作失败,或者事务是悬挂事务等)时,可以对所述事务号对应的事务进行回滚操作。从而可将数据库恢复到操作前的状态,并在回滚完毕后释放所述数据库连接,以避免在数据库操作发生异常时还继续占用系统资源。
在本申请的另一个实施例中,分布式事务一致性实现方法还可以包括:
定时检测所有事务的当前状态,并将其当前状态未达到预定要求的分布式事务统一进行回滚操作,并在回滚完毕后释放对应的数据库连接。
在分布式系统中,可能同时存在多个分布式事务,定时检测分布式系统中所有事务的当前状态,并将其中未达到预定要求的事务统一进行回滚操作。这种统一进行回滚操作的方式可以提高事务回滚效率。
在本申请的一个实施例中,所述当前状态未达到预定要求例如可以为:在发起事务请求后的设定时间内,事务当前未进入提交状态。
在本申请的另一个实施例中,分布式事务一致性实现方法还可以包括:
当接收到所述发起方发起的回滚请求时,对所述事务号对应的事务进行回滚操作,并在回滚完毕后释放所述数据库连接,所述回滚请求中携带有所述事务号。
在一些情况下,当所述发起方获知其对某一参与方的调用不符合预设的业务逻辑时,就会主动发起一个回滚请求。比如在一个具体的使用订单积分下订单的场景中,所述发起方针对一个订单事务,要求积分系统(一个参与方)减扣50个积分,然而积分系统发现所述事务号对应的账户的积分已不足50个积分,因此会告知所述发起方无法进行减扣,所述发起方得知无法进行减扣后,会主动发起一个回滚请求。
本申请实施例的分布式事务一致性实现方法的更为具体的实施步骤,可以参见图2所示。在图2中,所述的前置装置即为本申请实施例的执行主体。
由此可见,本申请实施例中,从事务请求到事务开启,再到发起方调用各个参与方,最后到事务提交,整个流程为一个完成的事务,发起方对所有参与方的调用是该事务的一部,只有发起方对所有参与方的成功执行完毕后,发起方才会发出事务提交请求,而只有事务提交成功,所有的调用才会生效,因此,本申请实施例不会存在一部分调用成功另一部分调用失败的中间状态,要么事务成功,要么事务失败,从而及时保证了分布式事务一致性。
虽然上文描述的过程流程包括以特定顺序出现的多个操作,但是,应当清楚了解,这些过程可以包括更多或更少的操作,这些操作可以顺序执行或并行执行(例如使用并行处理器或多线程环境)。
参考图3所示,本申请实施例的分布式事务一致性实现装置包括:
事务启动请求获取模块31,用于获取发起方发起的事务启动请求。一般的,所述的事务启动请求为开启分布式事务的请求。
事务启动请求启动模块32,用于为所述事务启动请求分配事务号及数据库连接,并向所述发起方返回所述事务号。
本申请实施例中,当收到发起方发起的事务启动请求时,可根据预设的事务号生成规则为所述事务启动请求生成一个事务号,并分配对应的数据库连接,从而开启事务。也就说,分配的事务号与分配的数据库连接是绑定的,以供后续数据库操作之用。其中,所述事务号是全局唯一的事务号,用来唯一识别一个事务。
事务开启后,应将生成的事务号返回给所述发起方,以供所述发起方在后续流程中使用。
调用请求处理模块33,用于在收到所述发起方调用各个参与方的调用请求时,基于所述调用请求中携带的事务号将所述调用请求路由至所述数据库连接中,以根据对应的调用请求执行相应的数据库操作。
在一个分布式事务中,参与方通常有多个(比如在一个订单事务中,订单系统作为发起方,其可能需要调用积分系统,可能需要调用电子优惠券系统,还可能需要调用支付系统等等),发起方可以按照预先设定的业务逻辑调用各个参与方,并在其发起的每个调用请求中携带所述事务号,本申请实施例的发起方调用各个参与方的场景中,所有的数据库操作均携带事务号。
本申请实例中,所述事务号不仅可以用来唯一识别一个事务,还可以用作路由标识,因此,基于所述调用请求中携带的事务号,可将所述调用请求路由至所述数据库连接中。
提交请求处理模块34,用于在收到所述发起方的事务提交请求时,基于所述事务提交请求中携带的事务号将所述事务提交请求路由至所述数据库连接中,以执行事务提交。
本申请实例中,从事务请求到事务开启,再到发起方调用各个参与方,最后到事务提交,整个流程为一个完成的事务,因此,调用请求处理模块33中所述的数据库操作,只有在事务成功提交后才能生效。当然,只有调用请求处理模块33中所述的数据库操作均完成后,才可能接收到所述发起方的事务提交请求。
在本申请另一实施例中,分布式事务一致性实现装置还可以包括:
第一回滚模块,用于当所述数据库操作发生异常时,对所述事务号对应的事务进行回滚操作,并在回滚完毕后释放所述数据库连接。从而可将数据库恢复到操作前的状态,并在回滚完毕后释放所述数据库连接,以避免在数据库操作发生异常时还继续占用系统资源。
在本申请另一实施例中,分布式事务一致性实现装置还可以包括:
第二回滚模块,用于定时检测所有事务的当前状态,并将其当前状态未达到预定要求的分布式事务统一进行回滚操作,并在回滚完毕后释放对应的数据库连接。
在分布式系统中,可能同时存在多个分布式事务,定时检测分布式系统中所有事务的当前状态,并将其中未达到预定要求的事务统一进行回滚操作。这种统一进行回滚操作的方式可以提高事务回滚效率。
在本申请的一个实施例中,所述当前状态未达到预定要求例如可以为:在发起事务请求后的设定时间内,事务当前未进入提交状态。
在本申请另一实施例中,分布式事务一致性实现装置还可以包括:
第三回滚模块,用于当接收到所述发起方发起的回滚请求时,对所述事务号对应的事务进行回滚操作,并在回滚完毕后释放所述数据库连接,所述回滚请求中携带有所述事务号。
在一些情况下,当所述发起方获知其对某一参与方的调用不符合预设的业务逻辑时,就会主动发起一个回滚请求。比如在一个具体的使用订单积分下订单的场景中,所述发起方针对一个订单事务,要求积分系统(一个参与方)减扣50个积分,然而积分系统发现所述事务号对应的账户的积分已不足50个积分,因此会告知所述发起方无法进行减扣,所述发起方得知无法进行减扣后,会主动发起一个回滚请求。
由此可见,本申请实施例中,从事务请求到事务开启,再到发起方调用各个参与方,最后到事务提交,整个流程为一个完成的事务,发起方对所有参与方的调用是该事务的一部,只有发起方对所有参与方的成功执行完毕后,发起方才会发出事务提交请求,而只有事务提交成功,所有的调用才会生效,因此,本申请实施例不会存在一部分调用成功另一部分调用失败的中间状态,要么事务成功,要么事务失败,从而及时保证了分布式事务一致性。
本领域技术人员还可以了解到本申请实施例列出的各种说明性逻辑块、单元和步骤可以通过硬件、软件或两者的结合来实现。至于是通过硬件还是软件来实现取决于特定的应用和整个系统的设计要求。本领域技术人员可以对于每种特定的应用,可以使用各种方法实现所述的功能,但这种实现不应被理解为超出本申请实施例保护的范围。
本申请实施例中所描述的各种说明性的逻辑块,或单元都可以通过通用处理器,数字信号处理器,专用集成电路(ASIC),现场可编程门阵列或其它可编程逻辑装置,离散门或晶体管逻辑,离散硬件部件,或上述任何组合的设计来实现或操作所描述的功能。通用处理器可以为微处理器,可选地,该通用处理器也可以为任何传统的处理器、控制器、微控制器或状态机。处理器也可以通过计算装置的组合来实现,例如数字信号处理器和微处理器,多个微处理器,一个或多个微处理器联合一个数字信号处理器核,或任何其它类似的配置来实现。
本申请实施例中所描述的方法或算法的步骤可以直接嵌入硬件、处理器执行的软件模块、或者这两者的结合。软件模块可以存储于RAM存储器、闪存、ROM存储器、EPROM存储器、EEPROM存储器、寄存器、硬盘、可移动磁盘、CD-ROM或本领域中其它任意形式的存储媒介中。示例性地,存储媒介可以与处理器连接,以使得处理器可以从存储媒介中读取信息,并可以向存储媒介存写信息。可选地,存储媒介还可以集成到处理器中。处理器和存储媒介可以设置于ASIC中,ASIC可以设置于用户终端中。可选地,处理器和存储媒介也可以设置于用户终端中的不同的部件中。
在一个或多个示例性的设计中,本申请实施例所描述的上述功能可以在硬件、软件、固件或这三者的任意组合来实现。如果在软件中实现,这些功能可以存储与电脑可读的媒介上,或以一个或多个指令或代码形式传输于电脑可读的媒介上。电脑可读媒介包括电脑存储媒介和便于使得让电脑程序从一个地方转移到其它地方的通信媒介。存储媒介可以是任何通用或特殊电脑可以接入访问的可用媒体。例如,这样的电脑可读媒体可以包括但不限于RAM、ROM、EEPROM、CD-ROM或其它光盘存储、磁盘存储或其它磁性存储装置,或其它任何可以用于承载或存储以指令或数据结构和其它可被通用或特殊电脑、或通用或特殊处理器读取形式的程序代码的媒介。此外,任何连接都可以被适当地定义为电脑可读媒介,例如,如果软件是从一个网站站点、服务器或其它远程资源通过一个同轴电缆、光纤电缆、双绞线、数字用户线(DSL)或以例如红外、无线和微波等无线方式传输的也被包含在所定义的电脑可读媒介中。所述的碟片(disk)和磁盘(disc)包括压缩磁盘、镭射盘、光盘、DVD、软盘和蓝光光盘,磁盘通常以磁性复制数据,而碟片通常以激光进行光学复制数据。上述的组合也可以包含在电脑可读媒介中。
以上所述的具体实施例,对本申请的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本申请实施例的具体实施例而已,并不用于限定本申请的保护范围,凡在本申请的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。