基于binlog补偿机制的分布式事务服务方法及系统技术方案

技术编号:14821241 阅读:61 留言:0更新日期:2017-03-15 19:39
本发明专利技术涉及一种基于binlog补偿机制的分布式事务服务方法,包括以下步骤:S1:将分布式事务的操作写入MySql的binlog事件中;S2:获取分布式事务的binlog事件,并对所述binlog事件进行解析,获得解析后的binlog数据;S3:根据所述解析后的binlog数据,判断所述分布式事务是否提交成功;若提交不成功,则取出与所述解析后的binlog数据对应的binlog事件,根据所述对应的binlog事件构造反向补偿的Sql语句并加以执行;否则完成。本发明专利技术还涉及一种基于binlog补偿机制的分布式事务服务系统。

【技术实现步骤摘要】

本专利技术涉及计算机网络
,尤其涉及一种基于binlog补偿机制的分布式事务服务方法及系统
技术介绍
OLTP(On-LineTransactionProcessing,联机事务处理)主要是执行基本的、日常的事务处理,比如数据库记录的增、删、改、查,对实时性要求较高。分布式事务作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行,具有原子性、一致性、隔离性、持久性。分布式事务涉及多个分布在不同地方的数据库,但对数据库的操作必须全部被提交或者回滚。只要任一数据库操作失败,所有参与事务的数据库都需要回滚。事务补偿是指对一个分布式事务做反向操作,比如一个分布式事务对一张表插入n条数据,则反向补偿时要将对应的n条数据删除。binlog(binarylog,二进制日志)是MySql执行改动产生的日志文件,以二进制的形式保存在磁盘中,可用于数据恢复和主从同步。在OLTP系统领域中,很多业务场景下都会面临事务一致性方面的需求,最典型的场景如转账业务,用户A给用户B转账,首先A账户扣款,然后B账户存入相应的金额,这两步操作要么全部成功,要么全部失败。任何一方成功、另一方失败,都会造成数据不一致。如果上述两个步骤涉及的是同一个数据库,则只需要借助关系型数据库自带的事务管理机制即可实现事务性的需求。然而现在大型互联网平台往往是由一系列分布式系统构成的,因此一笔业务处理可能需要调用多个“服务”并操作多个数据库才能完成,因此仅仅依赖关系型数据库自带的事务机制已经满足不了我们的需求。针对这一情况,现在业界提出的解决方案一般有两阶段提交协议(TwoPhaseCommitProtocol,2PC协议)和事务补偿机制。两阶段提交协议可以保证数据的强一致性,它是协调所有分布式原子事务参与者,并决定提交或者回滚的分布式算法。在两阶段提交协议中,系统一般包含两类机器(或节点):一类为协调者,通常一个系统中只有一个,另一类为事务参与者,一般包含多个。顾名思义,两阶段提交协议由两个阶段组成,其分别为请求阶段和提交阶段。在请求阶段,协调者通知所有的事务参与者准备提交事务或者取消事务,然后进入决策过程,所有的参与者告知协调者自己的决策:同意提交事务或者取消事务。在提交阶段,协调者会根据所有参与者的决策来决定是提交事务还是取消,当且仅当所有的参与者都准备好提交事务时,事务协调者才会给所有参与者发出提交事务的通知,否则,通知所有参与者取消事务。事务补偿机制指的是在一个分布式事务中,涉及到的所有数据库原子事务都必须存在一个对应的逆向补偿服务。分布式事务处理到中间状态失败时,对已经处理的数据库原子事务做反向补偿操作,达到访问数据库最终一致的要求,比如:第一个数据库提交成功后,访问第二个数据库失败时,需要在业务代码中,对第一个数据库提交成功的数据,做反向补偿操作。对于两阶段提交来说,该协议有一些缺点:同步阻塞:节点在等待消息的时候处于阻塞状态,节点中其他进程需要访问公共资源时则需要等待阻塞进程释放该资源。单点故障:如果协调者发生了故障,那么参与者将无法完成事务而一直阻塞下去。尤其在第二阶段,协调者发生故障,那么所有的参与者还都处于锁定事务资源的状态中,而无法继续完成事务操作。数据不一致:在提交阶段中,如果协调者在向一部分参与者发送提交通知后发生了故障,则收到通知的参与者会提交事务,而未收到通知的参与者无法执行事务提交,这会导致整个分布式系统中的数据不一致。现有的事务补偿机制也同样存在一些问题,例如会造成代码量庞大,耦合性高。而且非常有局限性,具体是因为很多的业务无法简单的实现回滚。如果串行的服务很多,回滚的成本实在太高,开发效率低下,尤其是在复杂场景下。
技术实现思路
有鉴于此,本专利技术提供一种基于binlog补偿机制的分布式事务服务方法及系统,能够根据MySql数据库的binlog解析构造反向补偿Sql语句,来进行数据库事务反向补偿保障数据一致性,减少业务方的代码量,且耦合度低,并且分布式事务的提交和补偿都是非阻塞的。为实现上述目的,根据本专利技术的一个方面,提供了一种基于binlog补偿机制的分布式事务服务方法。本专利技术的基于binlog补偿机制的分布式事务服务方法包括以下步骤:S1:将分布式事务的操作写入MySql的binlog事件中;S2:获取分布式事务的binlog事件,并对所述binlog事件进行解析,获得解析后的binlog数据;S3:根据所述解析后的binlog数据,判断所述分布式事务是否提交成功;若提交不成功,则取出与所述解析后的binlog数据对应的binlog事件,根据所述对应的binlog事件构造反向补偿的Sql语句并加以执行;否则完成。可选地,在步骤S1之前,开启所述MySql的binlog写入功能,并且将所述MySql的binlog格式设置为ROW模式。可选地,在步骤S3之前,设置所述分布式事务的超时时间;若在步骤S3中提交不成功,则判断是否收到补偿通知;若收到补偿通知,则取出所述解析后的binlog数据对应的binlog事件,根据所述对应的binlog事件构造反向补偿的Sql语句并加以执行;若没有收到补偿通知,则判断是否到达所述超时时间;若到达所述超时时间,则取出所述解析后的binlog数据对应的binlog事件,根据所述对应的binlog事件构造反向补偿的Sql语句并加以执行;否则根据所述解析后的binlog数据,判断所述分布式事务是否提交成功。可选地,所述ROW模式下的binlog-row-image设置为full。可选地,步骤S1还包括:创建数据库的事务表和状态字段,所述事务表用于记录所述数据库和所述操作的相关信息。可选地,所述相关信息包括但不局限于:唯一标识相应记录的主键id、所述数据库参与的分布式事务的id、所述分布式事务涉及的所有数据库的信息、记录所述数据库提交所述分布式事务的时间戳。可选地,反向补偿的Sql语句执行成功之后,删除所述事务表中的所有记录,并将状态字段设置为完成;所述分布式事务提交成功之后,将状态字段设置为完成。可选地,在步骤S2中获得解析后的binlog数据后,将解析后的binlog数据进行封装处理,并将封装的binlog数据存储在Redis或Memcache中。可选地,以数据库参与的分布式事务的id和数据库唯一标识为key,以封装好的、一个数据库事务所涉及的所有操作为value,将封装的binlog数据存储到Redis或Memcache中。根据本专利技术的另一方面,提供了一种基于binlog补偿机制的分布式事务服务系统。本专利技术的基于binlog补偿机制的分布式事务服务系统包括:写入模块,用于将分布式事务的操作写入MySql的binlog事件中;解析模块,用于获取分布式事务的binlog事件,并对所述binlog事件进行解析,获得解析后的binlog数据;判断和操作模块,用于根据所述解析后的binlog数据,判断所述分布式事务是否提交成功;若提交不成功,则所述判断和操作模块还用于取出所述解析后的binlog数据对应的binlog事件,根据所述对应的binlog事件构造反向补偿的Sql语句并加以执行;否则完成。可选地,还包括设置模块,用于开启所述MySql的binlog写入功能,本文档来自技高网
...
基于binlog补偿机制的分布式事务服务方法及系统

【技术保护点】
一种基于binlog补偿机制的分布式事务服务方法,其特征在于,包括以下步骤:S1:将分布式事务的操作写入MySql的binlog事件中;S2:获取分布式事务的binlog事件,并对所述binlog事件进行解析,获得解析后的binlog数据;S3:根据所述解析后的binlog数据,判断所述分布式事务是否提交成功;若提交不成功,则取出与所述解析后的binlog数据对应的binlog事件,根据所述对应的binlog事件构造反向补偿的Sql语句并加以执行;否则完成。

【技术特征摘要】
1.一种基于binlog补偿机制的分布式事务服务方法,其特征在于,包括以下步骤:S1:将分布式事务的操作写入MySql的binlog事件中;S2:获取分布式事务的binlog事件,并对所述binlog事件进行解析,获得解析后的binlog数据;S3:根据所述解析后的binlog数据,判断所述分布式事务是否提交成功;若提交不成功,则取出与所述解析后的binlog数据对应的binlog事件,根据所述对应的binlog事件构造反向补偿的Sql语句并加以执行;否则完成。2.根据权利要求1所述的方法,其特征在于,所述方法还包括:在步骤S1之前,开启所述MySql的binlog写入功能,并且将所述MySql的binlog格式设置为ROW模式。3.根据权利要求1所述的方法,其特征在于,所述方法还包括:在步骤S3之前,设置所述分布式事务的超时时间;若在步骤S3中提交不成功,则判断是否收到补偿通知;若收到补偿通知,则取出所述解析后的binlog数据对应的binlog事件,根据所述对应的binlog事件构造反向补偿的Sql语句并加以执行;若没有收到补偿通知,则判断是否到达所述超时时间;若到达所述超时时间,则取出所述解析后的binlog数据对应的binlog事件,根据所述对应的binlog事件构造反向补偿的Sql语句并加以执行;否则根据所述解析后的binlog数据,判断所述分布式事务是否提交成功。4.根据权利要求2所述的方法,其特征在于,所述ROW模式下的binlog-row-image设置为full。5.根据权利要求1-4的任一项所述的方法,其特征在于,步骤S1还包括:创建数据库的事务表和状态字段,所述事务表用于记录所述数据库和所述操作的相关信息。6.根据权利要求5所述的方法,其特征在于,所述相关信息包括但不局限于:唯一标识相应记录的主键id、所述数据库参与的分布式事务的id、所述分布式事务涉及的所有数据库的信息、记录所述数据库提交所述分布式事务的时间戳。7.根据权利要求5所述的方法,其特征在于,反向补偿的Sql语句执行成功之后,删除所述事务表中的所有记录,并将状态字段设置为完成;所述分布式事务提交成功之后,将状态字段设置为完成。8.根据权利要求1所述的方法,其特征在于,所述方法还包括:在步骤S2中获得解析后的binlog数据后,将解析后的binlog数据进行封装处理,并将封装的binlog数据存储在Redis或Memcache中。9.根据权利要求8所述的方法,其特征在于,以数据库参与的分布式事务的id和数据库唯一标识为key,以封装好的、一个数据库事务所涉及的所有操作为value,将封装的binlog数据存储到Redis或Memcache中。10.一种基于binlog补偿机制的分布式事务服务系统,其特征在于,包括:写入模块,用于将分布式事务的操作写入MyS...

【专利技术属性】
技术研发人员:王义林贾玉辰
申请(专利权)人:北京京东金融科技控股有限公司
类型:发明
国别省市:北京;11

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1