一种分布式事务处理方法、装置及***
技术领域
本发明涉及数据处理领域,尤其涉及一种分布式事务处理方法、装置及***。
背景技术
分布式事务是指事务的参与者、支持者的服务器、资源服务器以及事务管理器分别位于不同的分布式***的不同节点之上,或者可以理解为,一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用。
在分布式事务执行的过程中,需要保证分布式事务处理的隔离性,隔离性表示:事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的,通俗的理解为在一个事务没有执行完成之前,该事务包含的子事务是不能被用户看到的。当前,保障分布式事务执行处理的隔离性一直是分布式事务处理的难题。
发明内容
有鉴于此,本发明实施例公开了一种分布式事务处理方法、装置及***,保障了分布式事务在处理的过程中的隔离性的要求。
第一方面,本发明实施例公开了一种分布式事务的处理方法,其特征在于,所述方法应用于分布式***中的TM事务管理器,包括:
所述TM事务管理器接收Mysql分片数据库发送的分布式事务的子事务的版本号;
在接收到预设的触发指令的情况下,将已完成的分布式事务的各个子事务的版本号发送给预设的缓存数据库,所述版本号为所述预设的缓存数据库进行更新的基础;所述已完成的分布式事务为所有子事务的版本号均已被接收的分布式事务;
当接收到客户端的查询指令的情况下,在所述预设的缓存数据库中获取目标Mysql分片数据库的目标版本号;所述目标Mysql分片数据库为所述查询指令指向的Mysql分片数据库;所述预设的缓存数据库中存储有各个Mysql分片数据库的版本号;
将所述查询指令和所述目标版本号发送给所述目标Mysql分片数据库;所述目标版本号是所述目标Mysql分片数据库反馈所述查询指令对应的分布式事务的子事务的执行结果的依据,并且所述反馈的所述执行结果的分布式事务的子事务的版本号不超过所述目标版本号的指示范围;
接收Mysql分片数据库反馈的分布式子事务的执行结果,并将所述分布式子事务的执行结果发送给所述客户端。
可选的,还包括:
获取所述预设的缓存数据库中每个Mysql分片数据库对应的版本号,作为待留存的版本号;
向每个Mysql分片数据库发送版本号清除指令和相对应的待留存的版本号;所述清除指令和待留存的版本号用于指示所述Mysql分片数据库清除所述待留存版本号之内的其它版本号。
可选的,还包括:
在分布式事务执行的过程中,若出现所述TM事务管理器与Mysql分片数据库断开的情况,确定标记有待恢复模式的子事务;所述待恢复模式的子事务为所述TM事务管理器与所述Mysql分片数据库断开时,处于XA PREPARE阶段的子事务;
获取与所述待恢复模式的子事务属于同一个分布式事务的其它子事务的状态;
基于所述其它子事务的状态,确定所述待恢复模式的子事务的操作指令;所述操作指令包括提交或者回滚;
在所述TM事务管理器再次与所述Mysql分片数据库建立连接的情况下,向所述Mysql分片数据库发送所述待恢复模式的子事务的操作指令。
可选的,所述基于所述其它子事务执行的状态,确定所述待恢复模式的子事务的操作指令,包括:
若与所述待恢复模式的子事务属于同一个分布式事务的其它子事务的状态均为已提交,则所述待恢复模式的子事务的操作指令为提交;
若与所述待恢复模式的子事务属于同一个分布式事务的其它子事务的状态中包含回滚状态,则所述待恢复模式的子事务的操作指令为回滚;
若与所述待恢复模式的子事务属于同一分布式事务的其它子事务的状态均不存在回滚或者提交状态,则依据预设的操作规则确定所述待恢复模式的子事务的操作指令。
第二方面,本发明实施例还公开了一种分布式事务的处理方法,所述方法应用于分布式事务的Mysql分片数据库,包括:
分布式事务的子事务在Mysql分片数据库中执行了提交操作的情况下,生成所述子事务的版本号,并将所述子事务的版本号发送给TM事务管理器;
在接收到TM事务管理器发送的查询指令和目标版本号的情况下,获取版本号在所述目标版本号的指示范围内且所述查询指令对应的分布式事务的子事务的执行结果;所述目标版本号是在预设的缓存数据库中获取的;所述缓存数据库中存储有各个Mysql分片数据库的版本号,且所述预设的缓存数据库中的版本号是通过所述TM事务管理器发送的已完成的分布式事务的各个子事务的版本号进行更新的,所述已完成的分布式事务为所述TM事务管理器中分布式事务的所有子事务的版本号均已被接收的分布式事务;
将所述版本号在所述目标版本号的指示范围内且所述查询指令对应的分布式事务的子事务的执行结果,发送给所述TM事务管理器。
可选的,所述在接收到TM事务管理器发送的查询指令和目标版本号的情况下,获取版本号在所述目标版本号的指示范围内且所述查询指令对应的分布式事务的子事务的执行结果,包括:
在接收到所述TM事务管理器发送的查询指令和目标版本号的情况下,获取所述查询指令对应的分布式事务的子事务的执行结果;
从所述查询指令对应的分布式事务的子事务的执行结果中筛选出,版本号在所述目标版本号范围内分布式事务的子事务的执行结果。
可选的,还包括:
在分布式事务执行的过程中,若出现TM事务管理器与Mysql分片数据库断开的情况,将处于XA PREPARE阶段的子事务标记为待恢复模式;
当所述TM事务管理器再次与所述Mysql分片数据库建立连接的情况下,接收所述TM事务管理器发送的所述待恢复模式的子事务的操作指令;所述待恢复模式的子事务的操作指令是基于与所述待恢复模式的子事务属于同一个分布式事务的其它子事务的状态确定的;
根据所述操作指令对所述待恢复模式的子事务执行提交或者回滚的操作。
可选的,还包括:
当所述TM事务管理器再次与Mysql分片数据库建立连接的情况下,筛选出不存在活跃事务的连接会话;
通过所述不存在活跃事务的连接会话执行所述待恢复模式的子事务的操作指令。
可选的,在包含多个不存在活跃事务的连接会话的情况下,筛选一个连接会话执行所述待恢复模式的子事务的操作指令。
可选的,还包括:
在对Mysql分片数据库的binlog中的记录进行回放的过程中,若回放到分布式事务的子事务的XA START阶段,在所述SQL线程上创建新的用于记录所述分布式事务数据变化的数据表格并在回放完成后,将所述数据表格与所述SQL线程进行解绑;所述Mysql分片数据库的binlog中记录有事务执行的过程中的每个阶段;
若回放到分布式事务的子事务的XA_PREPARE阶段且所述子事务对应的分布式事务为未完成,将与所述分布式事务的子事务在之前XA START阶段创建的数据表格绑定到所述SQL线程上,并在回放完成后,将所述数据表格与所述SQL线程进行解绑;
若回放到分布式事务的子事务的XA COMMIT或者ROLLBACK阶段的情况下,将记录了所述分布式事务的子事务的XA_PREPARE阶段回放结果的数据表格绑定到所述SQL线程,在回放完成后,将所述数据表格与所述SQL线程进行解绑。
可选的,还包括:
在回放到分布式事务的子事务的XA_PREPARE阶段,且所述子事务所属的分布式事务的状态为已完成,则对所述分布式事务的子事务执行提交操作。
第三方面:本发明实施例还公开了一种分布式事务的处理装置,所述装置应用于分布式***中的TM事务管理器,所述装置包括:
接收单元,用于所述TM事务管理器接收Mysql分片数据库发送的分布式事务的子事务的版本号;
第一发送单元,用于在接收到预设的触发指令的情况下,将已完成的分布式事务的各个子事务的版本号发送给预设的缓存数据库,所述版本号为所述预设的缓存数据库进行更新的基础;所述已完成的分布式事务为所有子事务的版本号均已被接收的分布式事务;
目标版本号获取单元,用于当接收到客户端的查询指令的情况下,在所述预设的缓存数据库中获取目标Mysql分片数据库的目标版本号;所述目标Mysql分片数据库为所述查询指令指向的Mysql分片数据库;所述预设的缓存数据库中存储有各个Mysql分片数据库的版本号;
查询指令和目标版本号发送单元,用于将所述查询指令和所述目标版本号发送给所述目标Mysql分片数据库;所述目标版本号是所述目标Mysql分片数据库反馈所述查询指令对应的分布式事务的子事务的执行结果的依据,并且所述反馈的所述执行结果的分布式事务的子事务的版本号不超过所述目标版本号的指示范围;
执行结果接收单元,用于接收Mysql分片数据库反馈的分布式子事务的执行结果,并将所述分布式子事务的执行结果发送给所述客户端。
第三方面:本发明实施例还公开了一种分布式事务的处理装置,所述装置应用于分布式事务的Mysql分片数据库,所述装置包括:
第二发送单元,用于分布式事务的子事务在Mysql分片数据库中执行了提交操作的情况下,生成所述子事务的版本号,并将所述子事务的版本号发送给TM事务管理器;
执行结果获取单元,用于在接收到TM事务管理器发送的查询指令和目标版本号的情况下,获取版本号在所述目标版本号的指示范围内且所述查询指令对应的分布式事务的子事务的执行结果;所述目标版本号是在预设的缓存数据库中获取的;所述缓存数据库中存储有各个Mysql分片数据库的版本号,且所述预设的缓存数据库中的版本号是通过所述TM事务管理器发送的已完成的分布式事务的各个子事务的版本号进行更新的,所述已完成的分布式事务为所述TM事务管理器中分布式事务的所有子事务的版本号均已被接收的分布式事务;
执行结果发送单元,用于将所述版本号在所述目标版本号的指示范围内且所述查询指令对应的分布式事务的子事务的执行结果,发送给所述TM事务管理器。
第五方面,本发明实施例还公开了一种分布式***,包括:
TM事务管理器集群、Mysql数据库集群以及预设的缓存数据库;
所述TM事务管理器集群包括至少一个TM事务管理器,Mysql数据库集群包括至少一个Mysql分片数据库;
所述TM事务管理器用于执行上述第一方面所述的分布式事务的处理方法中的任一项;
所述Mysql分片数据库用于执行上述第二方面所述的分布式事务的处理方法中的任一项;
所述预设的缓存数据库用于接收TM事务管理器发送的分布式事务的各个子事务的版本号,并依据接收到的所述已完成的分布式事务的各个子事务的版本号对存储的版本号进行更新。
可选的,还包括:
自动恢复机器人,用于感知***故障,分析故障类型,并基于故障类型确定故障解决策略。
本发明实施例公开了一种分布式事务处理方法装置及***,该方法通过TM事务管理器控制Mysql分片数据库中客户端能够查询分布式事务的版本号,TM事务管理器接收Mysql分片数据库发送的分布式事务的子事务的版本号,并在接收到预设的触发指令的情况下,将已完成的分布式事务的各个子事务的版本号发送给预设的缓存数据库,以供缓存数据库更新版本号。也就是说缓存数据库中的版本号所指示的范围均为已执行完的分布式事务。那么基于上述的条件,当接收到客户端发送的查询指令的情况下,TM事务管理器会将查询指令和缓存数据库中查询指令指向的目标版本号发送给Mysql分片数据库,这样可以使得Mysql分片数据库反馈的分布式事务的子事务的执行结果不超过目标版本号指示的范围。由此可知,通过TM事务管理器发送的目标版本号的限制,即使Mysql分片数据库中已经存储了某个未执行完成的分布式事务的子事务的版本号,也不会将未完成的分布式事务的子事务的执行状态反馈给客户端,这样保障了分布式事务的隔离性。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1示出了本发明实施例提供的一种分布式事务的处理方法的流程示意图;
图2示出了示出了本发明实施例提供的一种历史版本号清除方法的流程示意图;
图3示出了本发明实施例提供的一种分布式事务的处理方法的又一流程示意图;
图4示出了本发明实施例提供的一种分布式事务的处理方法的又一流程示意图;
图5示出了本发明实施例公开了一种分布式事务的处理方法的又一流程示意图;
图6示出了本发明实施例提供的一种分布式事务回放的方法的流程示意图;
图7示出了本发明实施例提供的一种分布式事务的处理方法的另一流程示意图;
图8示出了本发明实施例提供的一种分布式事务的处理装置的结构示意图;
图9示出了本发明实施例提供的一种分布式事务的处理装置的又一结构示意图;
图10示出了本发明实施例提供的一种分布式***的结构示意图;
图11示出了一种分布式***的又一结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
参考图1,示出了本发明实施例提供的一种分布式事务的处理方法的流程示意图,该方法应用于分布式***中的TM事务管理器;其中,该分布式***包括:
TM事务管理器集群、Mysql数据库集群以及预设的缓存数据库;
其中,TM事务管理器集群包括至少一个TM事务管理器,Mysql数据库集群包括至少一个Mysql分片数据库;
本实施例中,预设的缓存数据库可以为任何一种能够进行数据存储的数据库,例如可以为Redis数据库集群。
在本实施例中,该方法包括:
S101:所述TM事务管理器接收Mysql分片数据库发送的分布式事务的子事务的版本号;
本实施例中,分布式事务包括多个子事务,每个子事务在不同的Mysql分片数据库中执行,子事务在Mysql分片数据库中执行了提交操作的情况下,会生成该子事务的版本号,Mysql分片数据库将生成的版本号发送给TM事务管理器,TM事务管理器接收该子事务的版本号。
S102:在接收到预设的触发指令的情况下,将已完成的分布式事务的各个子事务的版本号发送给预设的缓存数据库,所述版本号为所述预设的缓存数据库进行更新的基础;所述已完成的分布式事务为所有子事务的版本号均已被接收到的分布式事务;
需要知道的是,一个分布式事务包括多个子事务,每个子事务均执行了提交操作后,才表示该分布式事务执行完成,当任何一个子事务处于未提交的状态,则表示该分布式事务为未完成。
本实施例中,分布式事务的子事务在Mysql分片数据库中执行,执行了提交操作后,会将生成的分布式事务的子事务的版本号发送给TM事务管理器,那么TM事务管理器只有在接收到分布式事务的所有子事务的版本号的情况下,则可以认为该分布式事务为已完成的分布式事务。
本实施例中,TM事务管理器在接收到预设的触发指令的情况下,会检测是否存在已完成的分布式事务,若存在已完成的分布式事务,则将该已完成的分布式事务的版本号发送给预设的缓存数据库。
本实施例中,预设的触发指令可以包括如下的两种情况,包括:
情况一、预设的触发指令为:接收到新的分布式事务的子事务的版本号的情况下;
其中,新的分布式事务为TM事务管理器未接收过的分布式事务。
本实施例中,当TM事务管理器接收到新的分布式事务的子事务的版本号的情况下,若检测到存在已完成的分布式事务,则将已完成的分布式事务的版本号发送给预设的缓存数据库。
情况二、预设的触发指令为:接收到向预设的缓存数据库反馈版本号的指令。
本实施例中向预设的缓存数据反馈版本号的指令可以是定时发送的,也可以是基于用户需求发送的,本实施例中不进行限定。
本实施例中,将已完成的分布式事务的版本号发送给预设的缓存数据库,缓存数据库会依据接收到的版本号对当前存储的版本号进行更新。
举例说明:当TM事务管理器接收到预设的触发指令的情况下,检测到包含一个已执行完成的分布式事务,该分布式事务包括3个子事务,这三个子事务分别在Mysql分片数据库1、Mysql分片数据库2和Mysql分片数据库3中被执行,执行完成后这三个子事务的版本号分别为80,90,100。若TM事务管理器将该已完成的分布式事务的各个子事务发送给预设的缓存数据库。缓存数据库对存储的版本号进行更新,即将Mysql分片数据库1对应的版本号更新为80,将Mysql分片数据库2的版本号更新为90,将Mysql分片数据库3对应的版本号更新为100。
由此可知,通过TM事务管理器对缓存数据库中存储的每个Mysql分片数据库的版本号进行更新,这样一方面保障了Mysql分片数据库中存储的版本号均为已完成的分布式事务的子事务的版本号;另一方面,也保障了缓存数据库中存储的版本号为Mysql分片数据库中可用于查询的最大的版本号。
S103:当接收到客户端的查询指令的情况下,在所述预设的缓存数据库中获取目标Mysql分片数据库的目标版本号;所述目标Mysql分片数据库为所述查询指令指向的Mysql分片数据库;所述预设的缓存数据库中存储有各个Mysql分片数据库的版本号;
本实施例中,客户端的查询指令指向的Mysql分片数据库可能包括一个或者多个,缓存数据库中存储有每个Mysql分片数据库中的版本号,且缓存数据库中存储的各个Mysql分片数据库的版本号指示在该版本号范围内的版本号均为已执行完成的分布式事务的子事务的版本号。
举例说明:若预设的缓存数据库中存储的Mysql分片数据库1的版本号为80,则表示Mysql分片数据库1中1-80范围内的版本号均为已执行完成的分布式事务的子事务的版本号。本实施例中,将客户端的查询指令指向的Mysql分片数据库可以表示为目标Mysql分片数据库,TM事务管理器从预设的缓存数据库中获取目标Mysql分片数据库的目标版本号。
S104:将所述查询指令和所述目标版本号发送给所述目标Mysql分片数据库;所述目标版本号是所述目标Mysql分片数据库反馈所述查询指令对应的分布式事务的子事务的执行结果的依据,并且所述反馈的所述执行结果的分布式事务的子事务的版本号不超过所述目标版本号的指示范围;
本实施例中,目标Mysql分片数据库在接收到TM事务管理器发送的查询指令和目标版本号的情况下,Mysql分片数据库会依据目标版本号反馈查询指令对应的分布式事务的子事务的执行结果,且反馈的该执行结果的分布式事务的子事务的版本号不超过该目标版本号的指示范围。
其中,目标Mysql分片数据库如何依据目标版本号反馈查询指令对应的分布式事务的子事务的执行结果的具体过程,下文会进行详细的介绍,本实施例中不在赘述。
举例说明:假设查询指令指向的目标Mysql分片数据库在预设的缓存数据库中的版本号为90,那么目标Mysql分片数据库反馈的执行结果的分布式事务的子事务的版本号不超过90。
本实施例中,若目标Mysql分片数据库中包含超过目标版本号的子事务,则认为该子事务的分布式事务为未执行完成的,在这种情况下,为了保障分布式事务的隔离性,是不能将该子事务的执行结果反馈给客户的,即不能将未执行完成的分布式事务的中间过程暴露给客户的。
可以理解为,Mysql分片数据库反馈的查询指令的查询结果(分布式事务的子事务的执行结果)是经过筛选的,若查询结果对应的子事务的版本号在目标版本号范围内,则反馈给TM事务管理器,若查询结果对应的子事务的版本号超过了目标版本号的范围,则不将该查询结果反馈给TM事务管理器。由于目标版本号指示的范围为已完成的分布式事务的子事务的版本号,这样就避免了将未执行完成的分布式事务的子事务的执行结果反馈给TM事务管理器,保障了分布式事务的隔离性。
S105:接收Mysql分片数据库反馈的分布式子事务的执行结果,并将所述分布式子事务的执行结果发送给所述客户端。
通过上述的介绍可知,Mysql分片数据库反馈的执行结果的子事务的版本号不超过目标版本号指示的范围,即Mysql分片数据库反馈的执行结果的子事务均为已执行完成的分布式事务的子事务。
本实施例中,通过TM事务管理器控制Mysql分片数据库中客户端能够查询分布式事务的版本号,TM事务管理器接收Mysql分片数据库发送的分布式事务的子事务的版本号,并在接收到预设的触发指令的情况下,将已完成的分布式事务的各个子事务的版本号发送给预设的缓存数据库,以供缓存数据库更新版本号。也就是说缓存数据库中的版本号所指示的范围均为已执行完的分布式事务。那么基于上述的条件,当接收到客户端发送的查询指令的情况下,TM事务管理器会将查询指令和缓存数据库中查询指令指向的目标版本号发送给Mysql分片数据库,这样可以使得Mysql分片数据库反馈的分布式事务的子事务的执行结果不超过目标版本号指示的范围。由此可知,通过TM事务管理器发送的目标版本号的限制,即使Mysql分片数据库中已经存储了某个未执行完成的分布式事务的子事务的版本号,也不会将未完成的分布式事务的子事务的执行状态反馈给客户端,这样保障了分布式事务的隔离性。
本实施例中,Mysql分片数据库中不断的执行不同分布式事务的子事务,并不断的生成版本号,并且Mysql分片数据库中会将执行完成的子事务的版本号进行存储,随着数据量的不断增长,会占用Mysql分片数据库大量的存储空间,并影响Mysql分片数据库的处理效率,为了减轻Mysql分片数据库的存储压力,提升Mysql分片数据库的处理效率,可以对历史的版本号进行清除。但是由于Mysql分片数据库中可能会存在未执行完成的分布式事务的版本号,这样的版本号是不能被清除的。为了在清除历史版本号的基础上,保障未执行完成的分布式事务的版本号不被清除掉,参考图2,示出了本发明实施例提供的一种历史版本号清除方法的流程示意图,在本实施例中,该方法包括:
S201:获取所述预设的缓存数据库中每个Mysql分片数据库对应的版本号,作为待留存的版本号;
S202:向每个Mysql分片数据库发送版本号清除指令和相对应的待留存的版本号;所述清除指令和待留存的版本号用于指示所述Mysql分片数据库清除所述待留存版本号之内的其它版本号。
本实施例中,预设的缓存数据库中存储的每个Mysql分片数据库的版本号所指示的范围为已完成的分布式事务的子事务的版本号,为了方便描述,本实施例中,将预设的缓存数据库中每个Mysql分片数据库的版本号表示为待留存的版本号。本实施例中,针对任意一个Mysql分片数据库,超过该Mysql分片数据库的待留存版本号范围的很有可能是未完成的分布事务的子事务的版本号。基于此,为了保障不清除掉未完成的分布式事务的子事务的版本号,本实施例中,以待留存的版本号为基准,清除该待留存版本号范围内的其它版本号,即保留待留存版本号和超过待留存的版本号范围外的其它版本号。
本实施例中,预设的缓存数据库中存储的版本号指示的范围为已完成的分布式事务的子事务的版本号,以该版本号为基准,只清除在该版本号范围之内的版本号,这样不仅能达到减轻Mysql分片数据库的存储压力,提升Mysql分片数据库的处理效率的目的,并且保障未执行完成的分布式事务的版本号不被清除掉。
本实施例中,分布式事务在执行的过程中,会出现一些故障影响分布式事务的执行,例如可能会出现TM事务管理器与Mysql分片数据库断开的情况,在该种情况下,很有可能出现分布式事务的子事务未执行提交或者回滚的情况,但是该分布式事务其它子事务可能已经执行了提交或者回滚的操作,在这种情况下就无法保障分布式事务的一致性。
为了避免上述情况,参考图3,示出了本发明实施例提供的一种分布式事务的处理方法的又一流程示意图,该方法应用TM事务管理器,在本实施例中,该方法包括:
S301:在分布式事务执行的过程中,若出现所述TM事务管理器与Mysql分片数据库断开的情况,确定标记有待恢复模式的子事务;所述待恢复模式的子事务为所述TM事务管理器与所述Mysql分片数据库断开时,处于XA PREPARE阶段的子事务;
本实施例中,分布式事务在执行的过程中,若出现TM事务管理器与Mysql分片数据库断开的情况,Mysql分片数据库若存在处于XAPREPARE阶段的子事务,则将处于XAPREPARE阶段的子事务标记为待恢复的模式。
S302:获取与所述待恢复模式的子事务属于同一个分布式事务的其它子事务的状态;
S303:基于所述其它子事务的状态,确定所述待恢复模式的子事务的操作指令;所述操作指令包括提交或者回滚;
为了保障分布式事务的一致性,分布式事务的子事务要么全部提交或者全部回滚。基于以上原则,标记为待恢复的模式的子事务在下一步执行提交或者回滚的操作需要基于与该子事务属于同一个分布式事务的其它子事务的状态。
具体的,S303包括:
若与所述待恢复模式的子事务属于同一个分布式事务的其它子事务的状态均为已提交,则所述待恢复模式的子事务的操作指令为提交;
若与所述待恢复模式的子事务属于同一个分布式事务的其它子事务的状态中包含回滚状态,则所述待恢复模式的子事务的操作指令为回滚;
若与所述待恢复模式的子事务属于同一分布式事务的其它子事务的状态均不存在回滚或者提交状态,则依据预设的操作规则确定所述待恢复模式的子事务的操作指令。
S304:在所述TM事务管理器再次与所述Mysql分片数据库建立连接的情况下,向所述Mysql分片数据库发送所述待恢复模式的子事务的操作指令。
本实施例中,若TM事务管理器再次与Mysql分片数据库建立连接的情况下,TM事务管理器向Mysql分片数据库发送所述待恢复模式的子事务的操作指令,Mysql分片数据库基于该操作指令对该子事务执行提交或者回滚操作。
本实施例中,在分布式事务执行的过程中,对于出现的TM事务管理器与Mysql分片数据库断开的问题,通过将处于XAPREPARE阶段的子事务标记为待恢复模式的子事务,并基于与该子事务属于同一个分布事务的其它子事务的状态确定该子事务下一步执行提交还是回滚的操作,保障了分布式事务的一致性。
参考图4,示出了本发明实施例提供的一种分布式事务的处理方法的又一流程示意图,该方法应用于分布式事务的Mysql分片数据库,该方法包括:
S401:分布式事务的子事务在Mysql分片数据库中执行了提交操作的情况下,生成所述子事务的版本号,并将所述子事务的版本号发送给TM事务管理器;
本实施中,一个分布式事务包括多个子事务,每个子事务分别在不同的Mysql分片数据库中执行,在子事务执行了提交操作后,会在Mysql分片数据库中生成该子事务的版本号,并将该版本号发送给TM事务管理器。
并且,对于一个分布式事务,只有在该分布式事务包含的所有子事务全部执行完成的情况下,才表示该分布式事务执行完成,若该分布式事务包含的任何一个子事务未执行完成,则表示该分布式事务为未完成。
本实施例中,分布式事务的子事务在Mysql分片数据库中执行,执行了提交操作后,会将生成的分布式事务的子事务的版本号发送给TM事务管理器,那么TM事务管理器只有在接收到分布式事务的所有子事务的版本号的情况下,才可以认为该分布式事务为已完成的分布式事务。TM事务管理器在接收到预设的触发指令的情况下,检测是否存在已完成的分布式事务,若存在已完成的分布式事务,则将该已完成的分布式事务的版本号发送给预设的缓存数据库。
本实施例中,将已完成的分布式事务的版本号发送给预设的缓存数据库,缓存数据库会依据接收到的版本号对当前存储的版本号进行更新。
并且,缓存数据库中存储有每个Mysql分片数据库中的版本号,且缓存数据库中存储的各个Mysql分片数据库的版本号指示在该版本号范围内的版本号均为已执行完成的分布式事务的子事务的版本号。
S402:在接收到TM事务管理器发送的查询指令和目标版本号的情况下,获取版本号在所述目标版本号的指示范围内且所述查询指令对应的分布式事务的子事务的执行结果;
其中,所述目标版本号是在预设的缓存数据库中获取的,所述缓存数据库中存储有各个Mysql分片数据库的版本号,且所述预设的缓存数据库中的版本号是通过所述TM事务管理器发送的已完成的分布式事务的各个子事务的版本号进行更新的,所述已完成的分布式事务为所述TM事务管理器中分布式事务的所有子事务的版本号均已被接收的分布式事务。
通过上述的介绍可知,目标版本号指示在该版本号范围内的版本号均为已执行完成的分布式事务的子事务的版本号。Mysql分片数据库在接收到TM事务管理器发送的查询指令和目标版本号的情况下,基于目标版本号对最终反馈的结果进行了筛选,得到的反馈结果为:版本号在所述目标版本号的指示范围内且所述查询指令对应的分布式事务的子事务的执行结果。
其中,对于反馈结果的确定包含两个条件:
条件1:查询指令;
条件2:目标版本号。
基于上述两个条件确定查询结果的过程可以包括如下的两种方式:
方式一、在接收到所述TM事务管理器发送的查询指令和目标版本号的情况下,获取所述查询指令对应的分布式事务的子事务的执行结果;
从所述查询指令对应的分布式事务的子事务的执行结果中筛选出,版本号在所述目标版本号范围内分布式事务的子事务的执行结果。
方式二、在接受到所述TM事务管理器发送的查询指令和目标版本号的情况下,依据目标版本号确定查询结果所在的版本号的范围;
在查询结果所在的版本号的范围内确定查询指令对应的分布式事务的执行结果。
S403:将所述版本号在所述目标版本号的指示范围内且所述查询指令对应的分布式事务的子事务的执行结果,发送给所述TM事务管理器。
本实施例中,Mysql分片数据库在反馈查询指令指向的查询结果时,需要根据TM事务管理器发送的目标版本号,由于该目标版本号指示在该版本号范围内的版本号均为已执行完成的分布式事务的子事务的版本号,那么基于目标版本号的限定,Mysql分片数据库反馈的查询指令对应的查询结果的版本号均在目标版本号的范围内,在这种情况下,即使Mysql分片数据库中已经存储了某个未执行完成的分布式事务的子事务的版本号,也不会将未完成的分布式事务的子事务的执行状态反馈给客户端,这样保障了分布式事务的隔离性。
分布式事务在执行的过程中,会出现一些故障影响分布式事务的执行,例如可能会出现TM事务管理器与Mysql分片数据库断开的情况,在该种情况下,很有可能出现分布式事务的子事务未执行提交或者回滚的情况,但是该分布式事务其它子事务可能已经执行了提交或者回滚的操作,在这种情况下就无法保障分布式事务的一致性。
为了避免上述情况,参考图5,示出了本发明实施例公开了一种分布式事务的处理方法的又一流程示意图,在本实施例中,该方法包括:
S501:在分布式事务执行的过程中,若出现TM事务管理器与Mysql分片数据库断开的情况,将处于XA PREPARE阶段的子事务标记为待恢复模式;
S502:当所述TM事务管理器再次与所述Mysql分片数据库建立连接的情况下,接收所述TM事务管理器发送的所述待恢复模式的子事务的操作指令;所述待恢复模式的子事务的操作指令是基于与所述待恢复模式的子事务属于同一个分布式事务的其它子事务的状态确定的;
本实施例中,在出现TM事务管理器与Mysql分片数据库断开的情况下,将处于XAPREPARE阶段的子事务标记为待恢复模式,并通过与该子事务属于同一分布式事务的其它子事务的状态确定标记为待恢复模式的子事务下一步的操作。
操作指令的确定方法包括:
若与所述待恢复模式的子事务属于同一个分布式事务的其它子事务的状态均为已提交,则所述待恢复模式的子事务的操作指令为提交;
若与所述待恢复模式的子事务属于同一个分布式事务的其它子事务的状态中包含回滚状态,则所述待恢复模式的子事务的操作指令为回滚;
若与所述待恢复模式的子事务属于同一分布式事务的其它子事务的状态均不存在回滚或者提交状态,则依据预设的操作规则确定所述待恢复模式的子事务的操作指令。
S503:根据所述操作指令对所述待恢复模式的子事务执行提交或者回滚的操作。
本实施例中,若TM事务管理器再次与Mysql分片数据库建立连接的情况下,TM事务管理器向Mysql分片数据库发送所述待恢复模式的子事务的操作指令,Mysql分片数据库基于该操作指令对该子事务执行提交或者回滚操作。
并且,当所述TM事务管理器再次与Mysql分片数据库建立连接的情况下,可能会包括多个连接会话,但是对于正在执行其它操作的活跃的会话,不能再执行该被标记了待恢复模式的子事务,基于此,还包括:
当所述TM事务管理器再次与Mysql分片数据库建立连接的情况下,筛选出不存在活跃事务的连接会话;
通过所述不存在活跃事务的连接会话执行所述待恢复模式的子事务的操作指令。
并且,在包含多个不存在活跃事务的连接会话的情况下,筛选一个连接会话执行所述待恢复模式的子事务的操作指令。
本实施例中,在分布式事务执行的过程中,对于出现的TM事务管理器与Mysql分片数据库断开的问题,通过将处于XA PREPARE阶段的子事务标记为待恢复模式的子事务,并基于与该子事务属于同一个分布事务的其它子事务的状态确定该子事务下一步执行提交还是回滚的操作,保障了分布式事务的一致性。
本实施例中,为了提升Mysql分片数据库的容错能力,每个Mysql分片数据库包括至少一个从数据库,为了保障主库和从库数据的一致性,需要在从库中对Mysql分片数据库的binlog中的记录进行回放。
参考图6,示出了本发明实施例提供的一种分布式事务回放的方法的流程示意图,在本实施例中,该方法包括:
S601:在对Mysql分片数据库的binlog中的记录进行回放的过程中,若回放到分布式事务的子事务的XA START阶段,在所述SQL线程上创建新的用于记录所述分布式事务数据变化的数据表格,并在回放完成后,将所述数据表格与所述SQL线程进行解绑;所述Mysql分片数据库的binlog中记录有事务执行的过程中的每个阶段;
本实施例中,分布式事务在执行的过程中,将分布式事务的子事务的执行状态记录到binlog,现有技术中一般是将XA COMMIT或者ROLLBACK阶段记录到binlog中,为了提升分布式事务的一致性,将该分布式事务的子事务的XA START阶段、XA PREPARE阶段也记录到binlog中。
本实施例中,在对binlog中的记录进行回放时,若回放到分布式事务的子事务的XA START阶段,需要在SQL线程上创建新的数据表格,该数据表格用于记录所述分布式事务的数据变化。
需要说明的是,一般情况下,SQL线程上绑定有一个用于记录事务的数据变化的数据表格,例如innodb trx。但是对于分布式事务,由于一个分布式事务的子事务包括多个阶段,例如包括:XA START阶段、XA_PREPARE阶段以及XA COMMIT或者ROLLBACK阶段,但是这些阶段可能无法连续执行,例如在执行了一个子事务的XA START阶段后,回放了其它的事务,那么该子事务的回放过程就不连续了。因此,为了保障一个分布式事务的子事务回放的连续性,本实施例中,在执行到一个分布式事务的子事务的XASTART阶段的情况下,可以将SQL数据库中之前绑定的数据表格进行解绑,并创建新的数据表格用于记录分布式事务的子事务的执行过程。
并且,为了保障该数据表格仅记录该分布式事务的子事务的执行过程,在执行了该XA START阶段的回放后,将新创建的数据表格进行解绑。
并且,需要说明的是,在回放的过程中,当每次回放到某个分布式事务的子事务的XA START阶段时,都要创建一个新的用于记录该分布式事务的执行过程的数据表格。
举例说明:当回放到分布式事务1的子事务的XA START阶段时,在SQL线程上创建一个新的用于记录该分布式事务的执行过程的数据表格,回放了该分布式事务1的子事务的XA START阶段后,将该数据表格与SQL线程解绑。当回放到分布式事务2的子事务的XASTART阶段时,在SQL线程上再创建一个新的用于记录该分布式事务的执行过程的数据表格。
S602:若回放到分布式事务的子事务的XA_PREPARE阶段且所述子事务对应的分布式事务为未完成,将与所述分布式事务的子事务在之前XA START阶段创建的数据表格绑定到所述SQL线程上,并在回放完成后,将所述数据表格与所述SQL线程进行解绑;
本实施例中,为了保障分布式事务的子事务在回放过程中的连续性,当回放到分布式事务的子事务的XA_PREPARE阶段且所述子事务的情况下,将与所述分布式事务的子事务在之前XA START阶段创建的数据表格绑定到所述SQL线程上,并在回放完成后,将该数据表格与SQL线程解绑。
本实施例中,一个子事务在执行到XA_PREPARE阶段,还存在如下的两种情况:
情况一、一个子事务在执行到XA_PREPARE阶段的情况下,若该子事务对应的分布式事务还包括其它未执行完成的子事务,即该子事务所属的分布式事务的状态为未完成,那么该分布式事务在执行了XA_PREPARE阶段后,需要等待其它子事务的执行结果,即等待提交或者回滚指令,进而再执行提交或者回滚。
情况二、但是,若该子事务对应的分布式事务不包含其它的子事务,或者其它的子事务均已执行完成,即该子事务所属的分布式事务的状态为已完成,那么该分布式事务在执行了XA_PREPARE阶段后,为了提升处理效率,无需再等待其它的子事务,可以直接执行提交操作。
本实施例中,为了方便区别情况一和情况二,在分布式事务的子事务执行的过程中,可以对子事务进行标记,该标记可以区分该子事务所属的分布式事务的状态是否为已完成。
S603:若回放到分布式事务的子事务的XA COMMIT或者ROLLBACK阶段的情况下,将记录了所述分布式事务的子事务的XA_PREPARE阶段回放结果的数据表格绑定到所述SQL线程,在回放完成后,将所述数据表格与所述SQL线程进行解绑。
本实施例中,在回放的过程中,针对任何一个分布事务的子事务,创建属于该分布式事务的子事务的数据表格,并通过该数据表格记录该分布式事务的子事务的所有执行过程,这样,保障了回放过程中一个分布事务的子事务的执行过程的连续性。
参考图7,示出了本发明实施例提供的一种分布式事务的处理方法的交互示意图,该方法应用于分布式***,该方法包括:
S701:分布式事务的子事务在Mysql分片数据库中执行了提交操作的情况下,生成所述子事务的版本号,并将所述子事务的版本号发送给TM事务管理器;
S702:TM事务管理器在接收到预设的触发指令的情况下,将已完成的分布式事务的各个子事务的版本号发送给预设的缓存数据库;
S703:预设的缓存数据库依据接收到的已完成的分布式事务的各个子事务的版本号对存储的版本号进行更新;
S704:客户端向TM事务管理器发送查询指令;
S705:TM事务管理器在所述预设的缓存数据库中获取目标Mysql分片数据库的目标版本号;该目标Mysql分片数据库为查询指令指向的Mysql分片数据库;
S706:TM事务管理器将所述查询指令和所述目标版本号发送给所述目标Mysql分片数据库;
S707:目标Mysql分片数据库在接收到TM事务管理器发送的查询指令和目标版本号的情况下,获取版本号在所述目标版本号的指示范围内且所述查询指令对应的分布式事务的子事务的执行结果;
S708:目标Mysql分片数据库将所述版本号在所述目标版本号的指示范围内且所述查询指令对应的分布式事务的子事务的执行结果,发送给所述TM事务管理器。
本实施例中,通过TM事务管理器控制Mysql分片数据库中客户端能够查询分布式事务的版本号,TM事务管理器接收Mysql分片数据库发送的分布式事务的子事务的版本号,并在接收到预设的触发指令的情况下,将已完成的分布式事务的各个子事务的版本号发送给预设的缓存数据库,以供缓存数据库更新版本号。也就是说缓存数据库中的版本号所指示的范围均为已执行完的分布式事务。那么基于上述的条件,当接收到客户端发送的查询指令的情况下,TM事务管理器会将查询指令和缓存数据库中查询指令指向的目标版本号发送给Mysql分片数据库,这样可以使得Mysql分片数据库反馈的分布式事务的子事务的执行结果不超过目标版本号指示的范围。由此可知,通过TM事务管理器发送的目标版本号的限制,即使Mysql分片数据库中已经存储了某个未执行完成的分布式事务的子事务的版本号,也不会将未完成的分布式事务的子事务的执行状态反馈给客户端,这样保障了分布式事务的隔离性。
参考图8,示出了本发明实施例提供的一种分布式事务的处理装置的结构示意图,在本实施例中,该装置包括:
接收单元801,用于所述TM事务管理器接收Mysql分片数据库发送的分布式事务的子事务的版本号;
第一发送单元802,用于在接收到预设的触发指令的情况下,将已完成的分布式事务的各个子事务的版本号发送给预设的缓存数据库,所述版本号为所述预设的缓存数据库进行更新的基础;所述已完成的分布式事务为所有子事务的版本号均已被接收的分布式事务;
目标版本号获取单元803,用于当接收到客户端的查询指令的情况下,在所述预设的缓存数据库中获取目标Mysql分片数据库的目标版本号;所述目标Mysql分片数据库为所述查询指令指向的Mysql分片数据库;所述预设的缓存数据库中存储有各个Mysql分片数据库的版本号;
查询指令和目标版本号发送单元804,用于将所述查询指令和所述目标版本号发送给所述目标Mysql分片数据库;所述目标版本号是所述目标Mysql分片数据库反馈所述查询指令对应的分布式事务的子事务的执行结果的依据,并且所述反馈的所述执行结果的分布式事务的子事务的版本号不超过所述目标版本号的指示范围;
执行结果接收单元805,用于接收Mysql分片数据库反馈的分布式子事务的执行结果,并将所述分布式子事务的执行结果发送给所述客户端。
可选的,还包括:
待留存版本号获取单元,用于获取所述预设的缓存数据库中每个Mysql分片数据库对应的版本号,作为待留存的版本号;
历史版本号清除单元,用于向每个Mysql分片数据库发送版本号清除指令和相对应的待留存的版本号;所述清除指令和待留存的版本号用于指示所述Mysql分片数据库清除所述待留存版本号之内的其它版本号。
可选的,还包括:
待恢复模式的子事务确定单元,用于在分布式事务执行的过程中,若出现所述TM事务管理器与Mysql分片数据库断开的情况,确定标记有待恢复模式的子事务;所述待恢复模式的子事务为所述TM事务管理器与所述Mysql分片数据库断开时,处于XA PREPARE阶段的子事务;
子事务状态确定单元,用于获取与所述待恢复模式的子事务属于同一个分布式事务的其它子事务的状态;
操作指令确定单元,用于基于所述其它子事务的状态,确定所述待恢复模式的子事务的操作指令;所述操作指令包括提交或者回滚;
操作指令发送单元,用于在所述TM事务管理器再次与所述Mysql分片数据库建立连接的情况下,向所述Mysql分片数据库发送所述待恢复模式的子事务的操作指令。
可选的,所述操作指令确定单元,具体用于:
若与所述待恢复模式的子事务属于同一个分布式事务的其它子事务的状态均为已提交,则所述待恢复模式的子事务的操作指令为提交;
若与所述待恢复模式的子事务属于同一个分布式事务的其它子事务的状态中包含回滚状态,则所述待恢复模式的子事务的操作指令为回滚;
若与所述待恢复模式的子事务属于同一分布式事务的其它子事务的状态均不存在回滚或者提交状态,则依据预设的操作规则确定所述待恢复模式的子事务的操作指令。
通过本实施例的装置,保障了分布式事务的隔离性。
参考图9,示出了本发明实施例提供的一种分布式事务的处理装置的又一结构示意图,在本实施例中,该装置包括:
第二发送单元901,用于分布式事务的子事务在Mysql分片数据库中执行了提交操作的情况下,生成所述子事务的版本号,并将所述子事务的版本号发送给TM事务管理器;
执行结果获取单元902,用于在接收到TM事务管理器发送的查询指令和目标版本号的情况下,获取版本号在所述目标版本号的指示范围内且所述查询指令对应的分布式事务的子事务的执行结果;所述目标版本号是在预设的缓存数据库中获取的;所述缓存数据库中存储有各个Mysql分片数据库的版本号,且所述预设的缓存数据库中的版本号是通过所述TM事务管理器发送的已完成的分布式事务的各个子事务的版本号进行更新的,所述已完成的分布式事务为所述TM事务管理器中分布式事务的所有子事务的版本号均已被接收的分布式事务;
执行结果发送单元903,用于将所述版本号在所述目标版本号的指示范围内且所述查询指令对应的分布式事务的子事务的执行结果,发送给所述TM事务管理器。
可选的,所述执行结果获取单元,包括:
执行结果获取子单元,用于在接收到所述TM事务管理器发送的查询指令和目标版本号的情况下,获取所述查询指令对应的分布式事务的子事务的执行结果;
执行结果筛选子单元,用于从所述查询指令对应的分布式事务的子事务的执行结果中筛选出,版本号在所述目标版本号范围内分布式事务的子事务的执行结果。
可选的,还包括:
待恢复模式标记单元,用于在分布式事务执行的过程中,若出现TM事务管理器与Mysql分片数据库断开的情况,将处于XA PREPARE阶段的子事务标记为待恢复模式;
操作指令接收单元,用于当所述TM事务管理器再次与所述Mysql分片数据库建立连接的情况下,接收所述TM事务管理器发送的所述待恢复模式的子事务的操作指令;所述待恢复模式的子事务的操作指令是基于与所述待恢复模式的子事务属于同一个分布式事务的其它子事务的状态确定的;
第一操作指令执行单元,用于根据所述操作指令对所述待恢复模式的子事务执行提交或者回滚的操作。
可选的,还包括:
第一连接会话筛选单元,用于当所述TM事务管理器再次与Mysql分片数据库建立连接的情况下,筛选出不存在活跃事务的连接会话;
第二操作指令执行单元,用于通过所述不存在活跃事务的连接会话执行所述待恢复模式的子事务的操作指令。
可选的,还包括:
第二连接会话筛选单元,用于在包含多个不存在活跃事务的连接会话的情况下,筛选一个连接会话执行所述待恢复模式的子事务的操作指令。
可选的,还包括:
第一回放单元,用于在对Mysql分片数据库的binlog中的记录进行回放的过程中,若回放到分布式事务的子事务的XA START阶段,在所述SQL线程上创建新的用于记录所述分布式事务数据变化的数据表格并在回放完成后,将所述数据表格与所述SQL线程进行解绑;所述Mysql分片数据库的binlog中记录有事务执行的过程中的每个阶段;
第二回放单元,用于若回放到分布式事务的子事务的XA_PREPARE阶段且所述子事务对应的分布式事务为未完成,将与所述分布式事务的子事务在之前XA START阶段创建的数据表格绑定到所述SQL线程上,并在回放完成后,将所述数据表格与所述SQL线程进行解绑;
第三回放单元,用于若回放到分布式事务的子事务的XA COMMIT或者ROLLBACK阶段的情况下,将记录了所述分布式事务的子事务的XA_PREPARE阶段回放结果的数据表格绑定到所述SQL线程,在回放完成后,将所述数据表格与所述SQL线程进行解绑。
可选的,还包括:
第四回放单元,用于在回放到分布式事务的子事务的XA_PREPARE阶段,且所述子事务所属的分布式事务的状态为已完成,则对所述分布式事务的子事务执行提交操作。
通过本实施例的装置,Mysql分片数据库在反馈查询指令指向的查询结果时,需要根据TM事务管理器发送的目标版本号,由于该目标版本号指示在该版本号范围内的版本号均为已执行完成的分布式事务的子事务的版本号,那么基于目标版本号的限定,Mysql分片数据库反馈的查询指令对应的查询结果的版本号均在目标版本号的范围内,在这种情况下,即使Mysql分片数据库中已经存储了某个未执行完成的分布式事务的子事务的版本号,也不会将未完成的分布式事务的子事务的执行状态反馈给客户端,这样保障了分布式事务的隔离性。
参考图10,示出了本发明实施例提供的一种分布式***的结构示意图,该***包括:
TM事务管理器集群1001、Mysql数据库集群1002以及预设的缓存数据库1003;
所述TM事务管理器集群包括至少一个TM事务管理器,Mysql数据库集群包括至少一个Mysql分片数据库;
所述TM事务管理器用于执行下述的分布式事务的处理方法:
所述TM事务管理器接收Mysql分片数据库发送的分布式事务的子事务的版本号;
在接收到预设的触发指令的情况下,将已完成的分布式事务的各个子事务的版本号发送给预设的缓存数据库,所述版本号为所述预设的缓存数据库进行更新的基础;所述已完成的分布式事务为所有子事务的版本号均已被接收的分布式事务;
当接收到客户端的查询指令的情况下,在所述预设的缓存数据库中获取目标Mysql分片数据库的目标版本号;所述目标Mysql分片数据库为所述查询指令指向的Mysql分片数据库;所述预设的缓存数据库中存储有各个Mysql分片数据库的版本号;
将所述查询指令和所述目标版本号发送给所述目标Mysql分片数据库;所述目标版本号是所述目标Mysql分片数据库反馈所述查询指令对应的分布式事务的子事务的执行结果的依据,并且所述反馈的所述执行结果的分布式事务的子事务的版本号不超过所述目标版本号的指示范围;
接收Mysql分片数据库反馈的分布式子事务的执行结果,并将所述分布式子事务的执行结果发送给所述客户端。
可选的,还包括:
获取所述预设的缓存数据库中每个Mysql分片数据库对应的版本号,作为待留存的版本号;
向每个Mysql分片数据库发送版本号清除指令和相对应的待留存的版本号;所述清除指令和待留存的版本号用于指示所述Mysql分片数据库清除所述待留存版本号之内的其它版本号。
可选的,还包括:
在分布式事务执行的过程中,若出现所述TM事务管理器与Mysql分片数据库断开的情况,确定标记有待恢复模式的子事务;所述待恢复模式的子事务为所述TM事务管理器与所述Mysql分片数据库断开时,处于XA PREPARE阶段的子事务;
获取与所述待恢复模式的子事务属于同一个分布式事务的其它子事务的状态;
基于所述其它子事务的状态,确定所述待恢复模式的子事务的操作指令;所述操作指令包括提交或者回滚;
在所述TM事务管理器再次与所述Mysql分片数据库建立连接的情况下,向所述Mysql分片数据库发送所述待恢复模式的子事务的操作指令。
可选的,所述基于所述其它子事务执行的状态,确定所述待恢复模式的子事务的操作指令,包括:
若与所述待恢复模式的子事务属于同一个分布式事务的其它子事务的状态均为已提交,则所述待恢复模式的子事务的操作指令为提交;
若与所述待恢复模式的子事务属于同一个分布式事务的其它子事务的状态中包含回滚状态,则所述待恢复模式的子事务的操作指令为回滚;
若与所述待恢复模式的子事务属于同一分布式事务的其它子事务的状态均不存在回滚或者提交状态,则依据预设的操作规则确定所述待恢复模式的子事务的操作指令。
所述Mysql分片数据库用于执行下述所述的分布式事务的处理方法:
分布式事务的子事务在Mysql分片数据库中执行了提交操作的情况下,生成所述子事务的版本号,并将所述子事务的版本号发送给TM事务管理器;
在接收到TM事务管理器发送的查询指令和目标版本号的情况下,获取版本号在所述目标版本号的指示范围内且所述查询指令对应的分布式事务的子事务的执行结果;所述目标版本号是在预设的缓存数据库中获取的;所述缓存数据库中存储有各个Mysql分片数据库的版本号,且所述预设的缓存数据库中的版本号是通过所述TM事务管理器发送的已完成的分布式事务的各个子事务的版本号进行更新的,所述已完成的分布式事务为所述TM事务管理器中分布式事务的所有子事务的版本号均已被接收的分布式事务;
将所述版本号在所述目标版本号的指示范围内且所述查询指令对应的分布式事务的子事务的执行结果,发送给所述TM事务管理器。
可选的,所述在接收到TM事务管理器发送的查询指令和目标版本号的情况下,获取版本号在所述目标版本号的指示范围内且所述查询指令对应的分布式事务的子事务的执行结果,包括:
在接收到所述TM事务管理器发送的查询指令和目标版本号的情况下,获取所述查询指令对应的分布式事务的子事务的执行结果;
从所述查询指令对应的分布式事务的子事务的执行结果中筛选出,版本号在所述目标版本号范围内分布式事务的子事务的执行结果。
可选的,还包括:
在分布式事务执行的过程中,若出现TM事务管理器与Mysql分片数据库断开的情况,将处于XA PREPARE阶段的子事务标记为待恢复模式;
当所述TM事务管理器再次与所述Mysql分片数据库建立连接的情况下,接收所述TM事务管理器发送的所述待恢复模式的子事务的操作指令;所述待恢复模式的子事务的操作指令是基于与所述待恢复模式的子事务属于同一个分布式事务的其它子事务的状态确定的;
根据所述操作指令对所述待恢复模式的子事务执行提交或者回滚的操作。
可选的,还包括:
当所述TM事务管理器再次与Mysql分片数据库建立连接的情况下,筛选出不存在活跃事务的连接会话;
通过所述不存在活跃事务的连接会话执行所述待恢复模式的子事务的操作指令。
可选的,在包含多个不存在活跃事务的连接会话的情况下,筛选一个连接会话执行所述待恢复模式的子事务的操作指令。
可选的,还包括:
在对Mysql分片数据库的binlog中的记录进行回放的过程中,若回放到分布式事务的子事务的XA START阶段,在所述SQL线程上创建新的用于记录所述分布式事务数据变化的数据表格并在回放完成后,将所述数据表格与所述SQL线程进行解绑;所述Mysql分片数据库的binlog中记录有事务执行的过程中的每个阶段;
若回放到分布式事务的子事务的XA_PREPARE阶段且所述子事务对应的分布式事务为未完成,将与所述分布式事务的子事务在之前XA START阶段创建的数据表格绑定到所述SQL线程上,并在回放完成后,将所述数据表格与所述SQL线程进行解绑;
若回放到分布式事务的子事务的XA COMMIT或者ROLLBACK阶段的情况下,将记录了所述分布式事务的子事务的XA_PREPARE阶段回放结果的数据表格绑定到所述SQL线程,在回放完成后,将所述数据表格与所述SQL线程进行解绑。
可选的,还包括:
在回放到分布式事务的子事务的XA_PREPARE阶段,且所述子事务所属的分布式事务的状态为已完成,则对所述分布式事务的子事务执行提交操作。
所述预设的缓存数据库用于接收TM事务管理器发送的分布式事务的各个子事务的版本号,并依据接收到的所述已完成的分布式事务的各个子事务的版本号对存储的版本号进行更新;
可选的,所述预设的缓存数据库为Redis数据库集群;
可选的,参考图11,所述分布式***还包括:
自动恢复机器人1004,用于感知***故障,分析故障类型,并基于故障类型确定故障解决策略。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。