本发明涉及分布式系统技术领域,特别是涉及一种分布式事务处理方法及装置。
背景技术:
随着分布式技术在银行交易系统的逐渐使用,不可避免的会出现一个交易需要跨多个数据库或者跨多个子系统(微服务)并保证事务的情况。由于这些资源在物理上是完全独立的,所以要保证分布式下事务的原子性、一致性、隔离性以及持久性的控制就变得非常复杂。
举例来说,假设有一个交易为a给b转账200元,大致流程如下:
1)交易开始
2)调用转出服务,a转出200元;
3)调用转入服务,b转入200元;
4)交易结束
在分布式系统中,转入、转出服务可能位于不同的进程;或者a、b账户位于不同的数据库。并且每个步骤都有失败或异常的可能。这种情况下数据库自身的本地事务无法保证上述的两个步骤全部成功或全部失败。
业内目前现有的解决分布式事务问题的方案有:xa两阶段提交协议(2pc),tcc(try-confirm-cancel)等。
xa两阶段提交协议:基于2pc的分布式事务处理过程如下:在第一阶段,事务协调节点向所有事务参与者发送“准备”请求,如果所有事务参与者均返回“准备成功”,则在第二阶段,协调节点向所有参与者发送“提交”请求。各参与者在接收到上述“提交”请求之后,执行相应的数据处理子操作。如果在第一阶段,有任一参与者返回“准备失败”,则协调节点向所有参与者发送“回滚”请求。
tcc(try-confirm-cancel):tcc方案在服务层实现两阶段协议,将一个完整的流程从业务上划分为两个阶段。第一阶段(try)进行对应的合法性检查以及为事务执行预留所需的资源,确保第二阶段能够执行成功。事务中所有的第一阶段执行成功后,在进入第二阶段提交(confirm)阶段,使用使用预留的资源进行正式的业务操作;如果第一阶段执行出现异常等需要回滚分布式事务,则进行第二阶段回滚(cancel)阶段,将预留的资源解除预留。
针对上述两种分布式解决方案分析如下:
xa两阶段提交协议:
1)xa两阶段提交协议是一种阻塞协议,在业务执行以及提交的第一阶段需要等待最慢的一个事务分支完成。在此期间所有参与者一直占用系统资源,如锁资源、数据库连接资源等,导致系统资源的浪费,进而影响整体性能,无法实现高性能的分布式事务处理。
2)需要数据库支持xa协议,并且性能与保证度都依赖于数据库的实现。例如mysql从5.0开始部分支持xa协议,但在一定场景下,mysql的xa事务处理存在数据不一致的风险。
3)目前基于xa的分布式解决方案,大都依托于重量级的应用服务器(tuxedo/weblogic/websphere等),不适用于微服务架构
tcc(try-confirm-cancel):
1)对业务系统侵入性大,业务需要按try、confirm、cancel进行开发,成本较高;
资源预留不易处理,需要根据业务特征设计,处理不当难以保证一致性,或降低系统性能,当业务需求发生变更时难以及时响应变化。对业务开发人员的设计能力要求较高。
综上所述,需要提出一种能够在业务较低侵入的情况下,实现与数据库无关且资源占用周期较短的分布式事务的处理方案,以满足分布式系统下对数据一致性与高性能的需求。
技术实现要素:
本发明要解决的技术问题是提供一种分布式事务处理方法及装置,能够在保持对业务无侵入、只需要数据库支持本地事务的情况下保证分布式系统的事务一致性。
为解决上述技术问题,本发明提供了一种分布式事务处理方法,应用于全局事务应用服务器,包括:请求全局事务管理器记录事务的全局事务信息,并获取全局事务管理器返回的全局事务唯一标识;执行全局事务中所有事务分支操作;如果全局事务任意一个事务分支执行失败,请求全局事务管理器进行全局事务回滚;如果全局事务所有事务分支对应的本地事务都提交成功,请求全局事务管理器进行全局事务提交。
在一些实施方式中,还包括:向全局事务管理器请求全局事务回滚。
此外,本发明还提供了一种分布式事务处理方法,应用于事务分支应用服务器,包括:请求全局事务管理器记录事务分支的事务分支信息,并获取全局事务管理器返回的事务分支唯一标识;对事务分支数据源执行的sql进行拦截并解析;根据解析结果生成sql的前镜像记录;执行sql;根据执行结果生成sql的后镜像记录;根据全局事务唯一标识向全局事务管理器注册事务分支,并获取全局事务管理器返回的事务分支唯一标识;根据事务分支唯一标识,持久化当前事务分支中的前镜像记录及后镜像记录,作为回滚日志;提交本地事务,并释放本地事务对应的连接资源。
在一些实施方式中,对事务分支数据源执行的sql进行拦截并解析,包括:根据sql的解析结果,向逻辑锁模块查询所需数据是否被其它事务锁定。
在一些实施方式中,还包括:在提交本地事务之前,根据sql的前镜像记录及后镜像记录,请求逻辑锁模块加锁。
在一些实施方式中,还包括:如果事务分支执行失败,根据回滚日志进行事务回滚。
在一些实施方式中,还包括:获取全局事务管理器根据事务分支注册信息下发的事务分支提交命令;根据事务分支提交命令,清除回滚日志。
在一些实施方式中,还包括:获取全局事务管理器根据事务分支注册信息下发的事务分支回滚命令;根据事务分支回滚命令,锁定查询此事务分支修改过的任意一行记录数据;如果锁定查询失败,中断当前事务分支回滚,并等待全局事务管理器重新发起事务分支回滚命令;根据事务分支回滚命令,匹配对应的回滚日志;根据回滚日志,执行事务分支回滚操作。
在一些实施方式中,根据执行结果生成sql的后镜像记录,包括:如果所执行sql为insert或update语句,尝试根据前像数据及sql解析结果进行计算;无法计算或计算失败,再根据sql解析结果生成后像查询语句进行后像查询。
在一些实施方式中,根据执行结果生成sql的后镜像记录,包括:如果所执行sql为insert语句,且未包含所有主键信息,则通过连接获取所插入行缺失的主键值,再根据获取的主键值进行后像计算或后像查询。
在一些实施方式中,执行sql,包括:如果所执行sql为update或delete语句,且无法命中唯一记录,则在查询前像后,根据查询结果,修改sql为根据前像结果进行update或delete。
此外,本发明还提供了一种分布式事务处理方法,应用于全局事务管理器,包括:获取全局事务应用服务器提交的,请求记录全局事务信息的全局记录请求,并向全局事务应用服务器返回全局事务唯一标识;获取事务分支应用服务器提交的,请求记录事务分支信息的分支记录请求,并向事务分支应用服务器返回事务分支唯一标识;根据全局事务应用服务器的请求,进行全局事务提交。
在一些实施方式中,还包括:根据事务分支应用服务器的请求,反馈所需数据是否被其它事务锁定。
在一些实施方式中,还包括:根据事务分支应用服务器的请求,给对应事务加锁。
在一些实施方式中,还包括:获取全局事务应用服务器发起的全局事务提交请求;根据事务分支注册信息,向事务分支应用服务器下发事务分支提交命令;所有事务分支提交成功后,更新全局事务状态。
在一些实施方式中,还包括:获取全局事务应用服务器发起的,全局事务回滚请求;根据全局事务回滚请求,向全局事务应用服务器下发全局事务回滚命令;根据全局事务回滚请求,向事务分支应用服务器下发事务分支回滚明林;所有事务分支回滚成功后,更新全局事务状态。
此外,本发明还提供了一种分布式事务处理装置,集成于全局事务应用服务器,所述装置包括:一个或多个处理器;存储装置,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现根据前文所述的应用于全局事务应用服务器的分布式事务处理方法。
此外,本发明还提供了一种分布式事务处理装置,集成于事务分支应用服务器,所述装置包括:一个或多个处理器;存储装置,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现根据前文所述的应用于事务分支应用服务器的分布式事务处理方法。
此外,本发明还提供了一种分布式事务处理装置,集成于全局事务管理器,所述装置包括:一个或多个处理器;存储装置,用于村电弧一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现根据前文所述的应用于全局事务管理器的分布式事务处理方法。
采用这样的设计后,本发明至少具有以下优点:
提出了一种能够在业务较低侵入的情况下,实现与数据库无关且资源占用周期较短的分布式事务的处理方案,以满足分布式系统下对数据一致性与高性能的需求。
附图说明
上述仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,以下结合附图与具体实施方式对本发明作进一步的详细说明。
图1是本发明实施例提供的全局事务执行过程的流程图;
图2是本发明实施例提供的全局事务执行的交互流程图;
图3是本发明实施例提供的全局事务提交过程的流程图;
图4是本发明实施例提供的全局事务提交的交互流程图;
图5是本发明实施例提供的全局事务回滚过程的流程图;
图6是本发明实施例提供的全局事务回滚的交互流程图;
图7是本发明实施例提供的隔离控制机制的交互示意图;
图8是本发明实施例提供的全局事务应用服务器的结构图。
具体实施方式
以下结合附图对本发明的优选实施例进行说明,应当理解,此处所描述的优选实施例仅用于说明和解释本发明,并不用于限定本发明。
本发明提供一种通过在应用层模拟数据库的分布式事务处理机制,能够在保持对业务无侵入、只需要数据库支持本地事务的情况下保证分布式系统的事务一致性。
本发明提供的分布式事务处理方法涉及全局事务执行、全局事务提交,以及全局事务回滚三个阶段。每个阶段又进一步涉及全局事务服务器、事务分支服务器以及全局事务管理器三个实体装置。以下以不同的阶段为单位对本发明所提供的分布式事务处理方法进行说明。
图1示出了本发明提供的全局事务执行阶段的流程图。参见图1,全局事务执行阶段包括以下操作:
1)一个完整的全局事务由一个主事务和若干个事务分支组成,每个事务分支代表一个数据库本地事务。
2)交易开始时,开启全局事务,请求全局事务管理器记录相应的全局事务信息,全局事务管理器返回此全局事务唯一标识。
3)全局事务中,对每个事务分支对应的事务数据源执行的sql进行拦截并解析,进行如下处理:
a)数据库修改语句(dml):根据sql语句解析结果,在sql执行前后分别查询所要修改的数据,查询结果分别做为前像与后像;
b)数据库锁定查询语句:根据sql语句解析结果,向逻辑锁模块查询所需数据是否被其它事务模块锁定;如果已被其它事务锁定,则中止当前本地事务并抛出异常。
4)在数据库本地事务提交前,根据dml语句查询的前后像,请求逻辑锁模块加锁,如果加锁失败,则中止当前事务。
5)向全局事务管理器根据全局事务唯一标识注册事务分支,如果注册事务分支成功,全局事务管理器返回此事务分支唯一标识;否则中止当前事务。
6)根据全局事务唯一标识及事务分支唯一标识持久化当前本地事务中所有的前后镜像数据,做为回滚日志。
7)提交本地事务,并释放对应的连接资源。随着本地事务提交,数据库行锁也随之释放。
8)交易结束时,如果所有事务分支对应的本地事务都提交成功,且无其它异常,进行全局事务提交。
9)任一本地事务执行失败或其它业务需要,进行全局事务回滚。
图2示出了全局事务执行阶段不同网络实体之间的交互过程。其中的网络实体ap-1代表全局事务应用服务器,db-1代表全局事务数据库,ap-2代表事务分支应用服务器,db-2代表事务分支数据库,client代表客户端。
图3示出了全局事务提交阶段的流程。参见图3,全局事务提交阶段包括以下操作:
1)应用向全局事务管理器发起全局事务提交请求。
2)全局事务管理器更改全局事务状态。
3)逻辑锁模块释放此全局事务申请的所有逻辑锁。
4)全局事务管理器根据事务分支注册信息下发事务分支提交命令。
5)事务数据源接受事务分支提交命令后,根据全局事务及事务分支唯一标识清除记录的回滚日志。
6)所有事务分支提交成功后,全局事务管理器更新全局事务状态。
图4示出了全局事务提交阶段不同网络实体之间的交互过程。需要说明的是,在图4中示出的事务日志就是对应网络实体处存储的回滚日志。
图5示出了全局事务回滚阶段的流程。参见图5,全局事务回滚阶段包括以下操作:
1)应用向全局事务管理器发起全局事务回滚请求。
2)全局事务管理器更改全局事务状态。
3)全局事务管理器根据事务分支注册信息倒序下发事务分支回滚命令。
4)事务数据源接受事务分支回滚命令后,开启本地事务。
5)根据事务分支回滚命令,锁定查询此事务分支修改过任一行记录数据。如果锁定查询失败,则向全局事务管理器返回事务分支回滚失败,等待下一次重试。
6)根据全局事务及事务分支唯一标识查询事务分支回滚日志,如果未查询到回滚日志,则表明此分支已经回滚,直接返回事务分支回滚成功。
7)根据事务分支回滚日志,事务数据源查询当前数据是否与记录的后像数据相同,如果不同,向全局事务管理器返回异常信息,表明需要由人工处理。
8)如果当前数据与记录的后像数据相同,则根据如下规则执行回滚日志:
a)insert语句:根据后像日志,构造回滚sql删除已经插入到数据库的数据;
b)update语句:根据前像日志,构造回滚sql将已更新的数据恢复到更新前;
c)delete语句:根据前像日志,构造回滚sql将已删除的数据恢复到删除前。
9)在事务分支的回滚日志中所有记录执行完成后,删除回滚日志。
10)提交本地事务,返回事务分支回滚成功。
11)所有事务分支回滚成功后,逻辑锁模块释放此全局事务申请的所有逻辑锁。
12)全局事务管理器更新全局事务状态。
图6示出了不同网络实体在全局事务回滚阶段的交互流程。参见图6,其中涉及到的脏读是指数据库当前数据与此事务分支记录的后像数据不相同。
此外,对于dml语句,前后像生成以及执行规则如下:
1)在sql执行前,根据解析结果生成镜像查询语句,查询数据修改之前的数据记录,查询结果做为前像。
2)在sql执行后,根据解析结果与前像,尝试计算sql执行后的记录,计算结果做为后像。
3)如果计算后像失败,则根据解析结果生成镜像查询语句,查询数据修改之后的数据记录,查询结果做为后像。
4)如果所执行sql为insert语句,不需要查询前像。如果insert包含所有列信息,尝试计算后像,如果计算后像失败,则查询后像;如果insert包含所有主键信息,则根据sql与主键生成后像查询语句;如果未包含所有主键信息(如自增主键等),则通过连接获取所插入行缺失的主键值,再根据获取的主键值进行后像计算或后像查询。
5)如果所执行sql为update语句,则需要查询前像,并尝试计算后像,如果后像无法计算,则根据sql解析结果与前像数据查询后像。
6)如果所执行sql为delete语句,则只需要查询前像。
7)如果所执行sql为update或delete语句,且无法命中唯一记录,则在查询前像后,根据查询结果,修改sql为根据前像结果进行update或delete。
隔离控制模块负责对全局事务占用的资源进行隔离,保证并发情况下,全局事务的隔离性,事务资源同一时间只被一个全局事务修改,防止修改其他事务未提交数据。当前事务所占用的资源,只有在当前全局事务提交或回滚后,才能被其它事务所修改。
图7示出了隔离控制的交互过程。参见图7,总体设计为行级别的逻辑锁,记录最后修改本行的全局事务标识。需要获取或检查锁时,检查对应的事务状态来确定锁定情况。
主要包含以下几部分内容:
全局事务中通过parser业务sql获取资源信息,用于资源隔离判断、资源信息存储
全局事务中所占用的资源,只有在当前全局事务提交或回滚后,才能释放其资源锁定,资源才可以被其它事务访问。
非开启全局事务的业务场景,需要对于数据库行锁的语句进行资源隔离判断,以保证资源的隔离性。
图8是本发明实施例提供的全局事务应用服务器的结构图。参见图8,全局事务服务器包括:中央处理单元(cpu)801,其可以根据存储在只读存储器(rom)中的程序或者从存储部分808加载到随机访问存储器(ram)803中的程序而执行各种适当的动作和处理。在ram803中,还存储有系统操作所需的各种程序和数据。cpu801、rom802以及ram803通过总线804彼此相连。输入/输出(i/o)接口805也连接至总线804。
以下部件连接至i/o接口805:包括键盘、鼠标等的输入部分806;包括诸如阴极射线管(crt)、液晶显示器(lcd)等以及扬声器等的输出部分807;包括硬盘等的存储部分808;以及包括诸如lan卡、调制解调器等的网络接口卡的通信部分809。通信部分809经由诸如因特网的网络执行通信处理。驱动器810也根据需要连接至i/o接口805。可拆卸介质811,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器810上,以便于从其上读出的计算机程序根据需要被安装入存储部分808。
特别的,根据本发明实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本发明的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分809从网络上被下载和安装,和/或从可拆卸介质811被安装。在该计算机程序被中央处理单元(cpu)801执行时,执行本发明的方法中限定的上述功能。
另外,本发明提供的事务分支应用服务器以及全局事务管理器也可以具有如图8示出的结构。
本发明的主要有益效果包括:
1)跟具体的数据库无关,在本地事务支持之外不需要数据库额外提供其它特殊支持。
2)在事务分支完成后,立即释放数据库锁及数据库连接资源,提高分布式系统的资源利用率,减少不必要的资源占用和消耗,从而提供分布式事务的性能。
3)各个事务分支在第二阶段自动处理幂等性保证,无需业务系统关注幂等性问题。
4)对业务系统无侵入,自动处理分布式系统下资源隔离,不需要业务系统处理资源预留、业务确认及取消等逻辑,降低业务系统开发成本。
以上所述,仅是本发明的较佳实施例而已,并非对本发明作任何形式上的限制,本领域技术人员利用上述揭示的技术内容做出些许简单修改、等同变化或修饰,均落在本发明的保护范围内。
1.一种分布式事务处理方法,应用于全局事务应用服务器,其特征在于,包括:
请求全局事务管理器记录事务的全局事务信息,并获取全局事务管理器返回的全局事务唯一标识;
执行全局事务中所有事务分支操作;
如果全局事务任意一个事务分支执行失败,请求全局事务管理器进行全局事务回滚;
如果全局事务所有事务分支对应的本地事务都提交成功,请求全局事务管理器进行全局事务提交。
2.根据权利要求1所述的分布式事务处理方法,其特征在于,还包括:
向全局事务管理器请求全局事务回滚。
3.一种分布式事务处理方法,应用于事务分支应用服务器,其特征在于,包括:
请求全局事务管理器记录事务分支的事务分支信息,并获取全局事务管理器返回的事务分支唯一标识;
对事务分支数据源执行的sql进行拦截并解析;
根据解析结果生成sql的前镜像记录;
执行sql;
根据执行结果生成sql的后镜像记录;
根据全局事务唯一标识向全局事务管理器注册事务分支,并获取全局事务管理器返回的事务分支唯一标识;
根据事务分支唯一标识,持久化当前事务分支中的前镜像记录及后镜像记录,作为回滚日志;
提交本地事务,并释放本地事务对应的连接资源。
4.根据权利要求3所述的分布式事务处理方法,其特征在于,对事务分支数据源执行的sql进行拦截并解析,包括:
根据sql的解析结果,向逻辑锁模块查询所需数据是否被其它事务锁定。
5.根据权利要求3所述的分布式事务处理方法,其特征在于,还包括:
在提交本地事务之前,根据sql的前镜像记录及后镜像记录,请求逻辑锁模块加锁。
6.根据权利要求3所述的分布式事务处理方法,其特征在于,还包括:
如果事务分支执行失败,根据回滚日志进行事务回滚。
7.根据权利要求3所述的分布式事务处理方法,其特征在于,还包括:
获取全局事务管理器根据事务分支注册信息下发的事务分支提交命令;
根据事务分支提交命令,清除回滚日志。
8.根据权利要求3所述的分布式事务处理方法,其特征在于,还包括:
获取全局事务管理器根据事务分支注册信息下发的事务分支回滚命令;
根据事务分支回滚命令,锁定查询此事务分支修改过的任意一行记录数据;
如果锁定查询失败,中断当前事务分支回滚,并等待全局事务管理器重新发起事务分支回滚命令;
根据事务分支回滚命令,匹配对应的回滚日志;
根据回滚日志,执行事务分支回滚操作。
9.根据权利要求3所述的分布式事务处理方法,其特征在于,根据执行结果生成sql的后镜像记录,包括:
如果所执行sql为insert或update语句,尝试根据前像数据及sql解析结果进行计算;
无法计算或计算失败,再根据sql解析结果生成后像查询语句进行后像查询。
10.根据权利要求3所述的分布式事务处理方法,其特征在于,根据执行结果生成sql的后镜像记录,包括:
如果所执行sql为insert语句,且未包含所有主键信息,则通过连接获取所插入行缺失的主键值,再根据获取的主键值进行后像计算或后像查询。
11.根据权利要求3所述的分布式事务处理方法,其特征在于,执行sql,包括:
如果所执行sql为update或delete语句,且无法命中唯一记录,则在查询前像后,根据查询结果,修改sql为根据前像结果进行update或delete。
12.一种分布式事务处理方法,应用于全局事务管理器,其特征在于,包括:
获取全局事务应用服务器提交的,请求记录全局事务信息的全局记录请求,并向全局事务应用服务器返回全局事务唯一标识;
获取事务分支应用服务器提交的,请求记录事务分支信息的分支记录请求,并向事务分支应用服务器返回事务分支唯一标识;
根据全局事务应用服务器的请求,进行全局事务提交。
13.根据权利要求12所述分布式事务处理方法,其特征在于,还包括:
根据事务分支应用服务器的请求,反馈所需数据是否被其它事务锁定。
14.根据权利要求12所述的分布式事务处理方法,其特征在于,还包括:
根据事务分支应用服务器的请求,给对应事务加锁。
15.根据权利要求12所述的分布式事务处理方法,其特征在于,还包括:
获取全局事务应用服务器发起的全局事务提交请求;
根据事务分支注册信息,向事务分支应用服务器下发事务分支提交命令;
所有事务分支提交成功后,更新全局事务状态。
16.根据权利要求12所述的分布式事务处理方法,其特征在于,还包括:
获取全局事务应用服务器发起的,全局事务回滚请求;
根据全局事务回滚请求,向全局事务应用服务器下发全局事务回滚命令;
根据全局事务回滚请求,向事务分支应用服务器下发事务分支回滚命令;
所有事务分支回滚成功后,更新全局事务状态。
17.一种分布式事务处理装置,集成于全局事务应用服务器,其特征在于,包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序,
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现根据权利要求1或2所述的分布式事务处理方法。
18.一种分布式事务处理装置,集成于事务分支应用服务器,其特征在于,包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序,
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现根据权利要求3至11任意一项所述的分布式事务处理方法。
19.一种分布式事务处理装置,集成于全局事务管理器,其特征在于,包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序,
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现根据权利要求12至16任意一项所述的分布式事务处理方法。
技术总结