一种分布式事务管理方法及系统技术领域
本发明涉及计算机领域,特别是一种分布式管理方法;本发明还涉及一种用于实
现所述方法的分布式管理系统。
背景技术
在当今流行的分布式系统、微服务架构的系统中,一个请求通常不是由一个服务
中的一个方法单独完成,而是由多个系统、多个服务、操作多个数据库共同完成一个功能。
这样的一个请求,涉及到多个子服务系统之间的接口调用,不同服务中对不同的
数据库操作是在不同的事务之中。如果所有流程正常正确地完成,则不会有异常,但如果某
一个子系统子服务出现错误抛出异常的时候,它之前已经完成的服务和之后还未进行的服
务怎么处理,以及如何保证有服务抛出异常时,数据库的一致性,是一个急需解决的问题。
针对上述问题,公开号为CN103902560A的发明专利公开了一种分布式事务处理方
法及系统。所述方法包括:分布式事务管理器创建分布式全局事务;业务数据管理器根据所
述分布式全局事务创建对应的不少于一个的子事务;业务处理单元将所述分布式全局事务
和所述子事务进行关联;分布式事务管理器发起所述分布式全局事务的提交或回滚操作。
其中,当全局事务与子事务无法建立关联时,判断为异常情况,并将该具备事务进行回滚操
作。
然而,由于在一个分布式事务系统中事务复杂,可能出现的情况较多。现有技术仅
仅以全局事务与子事务无法建立关联作为异常情况,而且处理的方式单一,直接进行回滚
操作。这样这无法针对具体事务做出最合理的处理,影响了事务处理的效率。
发明内容
本发明的目的在于克服现有技术的缺点与不足,提供了一种分布式事务管理方法
及系统。
本发明具体通过以下的技术方案实现:一种分布式事务管理方法,包括以下步骤:
定义全局事务,并将该全局事务中调用的其他事务定义为子事务;
建立全局事务表,用于记录全局事务和子事务的状态;当调用全局事务时,在该全
局事务表中进行记录;当调用该全局事务中的子事务时,在该全局事务表中生成的子事务
记录;
定义一个全局事务管理器,用于扫描全局事务表,并进行判断:
若全局事务状态为失败,而该全局事务下存在成功的子事务过程,将成功子事务
进行回滚;
若全局事务状态为成功,而该全局事务下存在失败的子事务过程,则再次调用该
子事务;
若全局事务状态为未知,则将成功的子事务进行回滚。
作为本发明的进一步改进,还包括步骤:在调用子事务时,将该子事务的调用参数
和结果进行保存。
作为本发明的进一步改进,还包括步骤:在重复调用子事务时,保存重复调用的次
数和时间。
作为本发明的进一步改进,还包括步骤:当相同请求的子事务被重复调用时,跳过
该重复请求。
作为本发明的进一步改进,当全局事务状态为成功,而该全局事务下存在失败的
子事务过程时,将该失败的子事务进行升序排序,再逐一执行调用操作。
作为本发明的进一步改进,当全局事务状态为失败,而该全局事务下存在成功的
子事务过程时,对成功的子事务进行降序排序,再逐一进行回滚操作。
作为本发明的进一步改进,当同一个全局事务的子事务向前或回滚操作时,进行
数据库的行锁操作。
作为本发明的进一步改进,当有部分向前或回滚成功的子事务,则更新全局事务
的状态为“部分已回滚”。
作为本发明的进一步改进,当有全部向前或回滚成功的子事务,则更新全局事务
的状态为“已回滚”。
本发明还涉及一种分布式事务的管理系统,包括:
定义模块,用于定义全局事务,并将该全局事务中调用的其他事务定义为子事务;
全局事务表建立模块,用于建立全局事务表,所述全局事务表用于记录全局事务
和子事务的状态;当调用全局事务时,在该全局事务表中进行记录;当调用该全局事务中的
子事务时,在该全局事务表中生成的子事务记录;
全局事务管理器,用于扫描全局事务表,并进行判断:
若全局事务状态为失败,而该全局事务下存在成功的子事务过程,将成功子事务
进行回滚;
若全局事务状态为成功,而该全局事务下存在失败的子事务过程,则再次调用该
子事务;
若全局事务状态为未知,则将成功的子事务进行回滚。
作为本发明的进一步改进,还包括保存模块,用于在调用子事务时,将该子事务的
调用参数和结果进行保存。
作为本发明的进一步改进,所述保存模块,还用于在重复调用子事务时,保存重复
调用的次数和时间。
作为本发明的进一步改进,还包括请求判断模块,用于当判断为相同请求的子事
务被重复调用时,跳过该重复请求。
作为本发明的进一步改进,还包括升序排序模块,用于当全局事务状态为成功,而
该全局事务下存在失败的子事务过程时,将该失败的子事务进行升序排序。
作为本发明的进一步改进,还包括降序排序模块,用于当全局事务状态为失败,而
该全局事务下存在成功的子事务过程时,对成功的子事务进行降序排序。
作为本发明的进一步改进,还包括行锁模块,用于当同一个全局事务的子事务向
前或回滚操作时,进行数据库的行锁操作。
作为本发明的进一步改进,还包括状态更新模块,用于当有部分向前或回滚成功
的子事务,则更新全局事务的状态为“部分已回滚”。
作为本发明的进一步改进,还包括状态更新模块,用于当有全部向前或回滚成功
的子事务,则更新全局事务的状态为“已回滚”。
相比于现有技术,本发明具备以下有益效果:
解决了在分布式系统、微服务架构模式下,分布式事务难以统一管理,对其他服务
调用结果无法控制的问题。在框架的全局事务管理功能的支持下,开发者和系统维护人员
可以减少大量对错误数据的排查和维护,减少了对生产数据的人为操作,增强系统鲁棒性,
提高了数据正确性和可靠性,为多系统服务的复杂业务场景提供了简洁的维护思路。同时,
可以针对不同的业务进行对应的处理,方式丰富,可以针对不同的业务情况执行不同的处
理方式。
为了更好地理解和实施,下面结合附图详细说明本发明。
附图说明
图1是本发明的分布式事务管理方法的步骤方法流程图。
图2是本发明的分布式事务管理系统的模块连接框图。
具体实施方式
本发明为了解决现有技术中对于异常情况处理方式单一的缺陷,提供了一种分布
式事务的管理方法及系统,具体通过以下的实施例进行说明。
请参阅图1,其为本发明的分布式事务管理方法的步骤流程图。本发明提供了一种
分布式事务管理方法,包括以下步骤:
S1:定义全局事务,并将该全局事务中调用的其他事务定义为子事务。
S2:建立全局事务表,用于记录全局事务和子事务的状态;当调用全局事务时,在
该全局事务表中进行记录;当调用该全局事务中的子事务时,在该全局事务表中生成的子
事务记录。
具体的,在本步骤中,在调用一个全局事务过程时,将生成一个唯一的全局事务编
号,并在全局事务表中插入一条记录,代表这次调用。调用子事务时将生成对应全局事务记
录的子事务记录,子事务记录包括自己的唯一编号,全局事务编号,以及它在全局事务过程
中的序号。当每个子事务在成功或者异常时,会在数据库中更新该子事务的状态;当全局事
务完成或异常时,更新全局事务表中对应记录的状态。
S3:定义一个全局事务管理器,用于扫描全局事务表,并进行以下的判断。具体的,
在本发明中全局事务管理器每30秒扫描该全局事务表。
S31:若全局事务状态为失败,而该全局事务下存在成功的子事务过程,则执行步
骤:对成功的子事务进行降序排序,再逐一进行回滚操作。具体的,在本发明中通过所述全
局事务管理器自动调用该子事务的进行回滚,将已经修改的数据还原。
S32:若全局事务状态为成功,而该全局事务下存在失败的子事务过程,则执行步
骤:将该失败的子事务进行升序排序,再逐一执行调用操作。具体的,在本发明中通过全局
事务管理器再次调用该子事务方法,确保数据正常更新。
S33:若全局事务状态为未知,则将成功的子事务进行回滚。
进一步,在本发明中为了让全局事务管理器能够自动调用子事务前进或回滚,全
局事务表需要维护该子事务过程被调用时的请求参数,或者使用其他方式传递参数。当同
一个全局事务的子事务向前或回滚操作时,进行数据库的行锁操作,避免并发。
其中,对于当前向前或回滚失败的事务过程,需要更新下次开始时间避免过于频
繁。比如:默认递增30秒,后期可考虑第一次失败递增30秒,第二次递增60秒,第三次递增1
分钟,最大递增15分钟等。
S4:在调用子事务时,将该子事务的调用参数和结果进行保存。
S5:在重复调用子事务时,保存重复调用的次数和时间。
S6:当相同请求的子事务被重复调用时,跳过该重复请求。本步骤是为了维护数据
一致性,避免重复调用导致更多的异常,子事务需要保证幂等性。
S7:全局事务状态更新。当有部分向前或回滚成功的子事务,则更新全局事务的状
态为“部分已回滚”。当有全部向前或回滚成功的子事务,则更新全局事务的状态为“已回
滚”。
请参阅图2,其为本发明的分布式事务管理系统的模块连接框图。另外,本发明还
涉及一种分布式事务的管理系统,包括:定义模块1、全局事务表建立模块2、全局事务管理
器3、保存模块4、请求判断模块5、升序排序模块6、降序排序模块7、行锁模块8和状态更新模
块9。
所述定义模块1,用于定义全局事务,并将该全局事务中调用的其他事务定义为子
事务;
所述全局事务表建立模块2,用于建立全局事务表,所述全局事务表用于记录全局
事务和子事务的状态;当调用全局事务时,在该全局事务表中进行记录;当调用该全局事务
中的子事务时,在该全局事务表中生成的子事务记录;
所述全局事务管理器3,用于扫描全局事务表,并进行判断:
若全局事务状态为失败,而该全局事务下存在成功的子事务过程,将成功子事务
进行回滚;
若全局事务状态为成功,而该全局事务下存在失败的子事务过程,则再次调用该
子事务;
若全局事务状态为未知,则将成功的子事务进行回滚。
所述保存模块4,用于在调用子事务时,将该子事务的调用参数和结果进行保存。
所述保存模块,还用于在重复调用子事务时,保存重复调用的次数和时间。
所述请求判断模块5,用于当判断为相同请求的子事务被重复调用时,跳过该重复
请求。
所述升序排序模块6,用于当全局事务状态为成功,而该全局事务下存在失败的子
事务过程时,将该失败的子事务进行升序排序。
所述降序排序模块7,用于当全局事务状态为失败,而该全局事务下存在成功的子
事务过程时,对成功的子事务进行降序排序。
所述行锁模块8,用于当同一个全局事务的子事务向前或回滚操作时,进行数据库
的行锁操作。
所述状态更新模块9,用于当有部分向前或回滚成功的子事务,则更新全局事务的
状态为“部分已回滚”。所述状态更新模块,还用于当有全部向前或回滚成功的子事务,则更
新全局事务的状态为“已回滚”。
以下通过具体的实例,介绍本发明的分布式事务管理方法及系统时如何应用的。
例如:在一个很常见的电子商务系统中的一个出价过程中,可能会先调用优惠券
服务,获取用户的可用优惠券,然后调用资金账户服务,冻结用户的相应保证金,之后,再调
用缓存服务,更新出价记录。
如果前面的流程都正常进行,但更新出价记录时出错了,那么怎么对扣除优惠券
和冻结保证金服务进行回滚呢?在出价过程中,如果冻结保证金服务超时了,那怎么知道操
作是否成功,从而确保操作必须回滚呢?如果我们想在优惠券服务超时时不退出,而继续下
面的出价流程,那么怎么在后面自动维护优惠券的数据,自动扣减呢?
针对上述情况,处理方法为:
第一步,定义全局事务和子事务。其中,以出价过程为全局事务,并包括子事务1:
调用优惠券、子事务2:调用资金账户、子事务3:冻结保证金、子事务4:调用缓存服务,更新
出价记录。
第二步,建立全局事务表。具体的方式及代码可以为:
![]()
![]()
其中,相关的业务表需要记录transaction_id和transaction_sequence信息。
第三步、定义全局事务管理器,扫描该全局事务表中的全局事务和子事务的状态
信息。若全局事务状态为失败,而该全局事务下存在成功的子事务过程,则执行步骤:对成
功的子事务进行降序排序,再逐一进行回滚操作。具体的,在本发明中通过所述全局事务管
理器自动调用该子事务的进行回滚,将已经修改的数据还原。
若全局事务状态为成功,而该全局事务下存在失败的子事务过程,则执行步骤:将
该失败的子事务进行升序排序,再逐一执行调用操作。具体的,在本发明中通过全局事务管
理器再次调用该子事务方法,确保数据正常更新。
若全局事务状态为未知,则将成功的子事务进行回滚。
比如,可以根据实际情况定义不同的规则,比如包括以下情况:
![]()
![]()
实际情况中,可以根据子事务的重要性,选择不同的分类。比如:若子事务1比较重
要,可以将其定义为影响全局事务状态的必要因素,即子事务1失败,则全局事务必然失败。
以上仅仅是本发明的一个应用实例,本发明的分布式事务处理方法和系统还可以
应用在其他的业务实际中。
相比于现有技术,本发明具备以下有益效果:
解决了在分布式系统、微服务架构模式下,分布式事务难以统一管理,对其他服务
调用结果无法控制的问题。在框架的全局事务管理功能的支持下,开发者和系统维护人员
可以减少大量对错误数据的排查和维护,减少了对生产数据的人为操作,增强系统鲁棒性,
提高了数据正确性和可靠性,为多系统服务的复杂业务场景提供了简洁的维护思路。同时,
可以针对不同的业务进行对应的处理,方式丰富,可以针对不同的业务情况执行不同的处
理方式。
本发明并不局限于上述实施方式,如果对本发明的各种改动或变形不脱离本发明
的精神和范围,倘若这些改动和变形属于本发明的权利要求和等同技术范围之内,则本发
明也意图包含这些改动和变形。