首页> 中国专利> 处理事务的方法、处理事务的装置和电子设备

处理事务的方法、处理事务的装置和电子设备

摘要

本申请提供了一种处理事务的方法、处理事务的装置和电子设备。组合服务具有事务协调器TC的功能和事务管理器TM的功能,组合服务中包括至少一个原子服务;将原子服务的信息存储至数据库中,以使得组合服务在目标原子服务处理目标事务前获取目标原子服务的信息,采用目标原子服务处理目标事务。可以使用组合服务组合TC和TM,这样无需再独立部署TC和TM了,可以缩短组合服务和原子服务通信的时间,并且在目标原子服务处理目标事务前就将目标原子服务的信息存储到数据库中了,组合服务可以在处理目标事务前确定目标原子服务以及目标原子服务的信息了,无需TC和TM之间的频繁通信,进而可以缩短交易的执行时间,提高了事务的吞吐量。

著录项

  • 公开/公告号CN116319241A

    专利类型发明专利

  • 公开/公告日2023-06-23

    原文格式PDF

  • 申请/专利权人 中国邮政储蓄银行股份有限公司;

    申请/专利号CN202310267804.7

  • 申请日2023-03-14

  • 分类号H04L41/0273(2022.01);H04L41/5054(2022.01);G06F9/46(2006.01);G06F9/54(2006.01);

  • 代理机构北京康信知识产权代理有限责任公司 11240;

  • 代理人霍文娟

  • 地址 100032 北京市西城区金融大街3号

  • 入库时间 2024-01-17 01:11:24

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2023-07-11

    实质审查的生效 IPC(主分类):H04L41/0273 专利申请号:2023102678047 申请日:20230314

    实质审查的生效

  • 2023-06-23

    公开

    发明专利申请公布

说明书

技术领域

本申请涉及微服务技术领域,具体而言,涉及一种处理事务的方法、处理事务的装置和电子设备。

背景技术

Seata(Simple Extensible Autonomous Transaction Architecture,一种分布式事务框架)的全局事务管理器(TM)和资源管理器(RM)作为SDK被应用调用,事务协调器(TC)作为独立服务单独部署,TM、RM和TC并不是真实的服务器,而是用于实现具体功能的服务,全局事务的开启和提交由TM上报给TC,分支事务的开启和状态变化由RM上报给TC,分支事务的提交和回滚由TC通知RM执行。Seata之所以采用这样的设计,是因为TC无法在分支事务执行前获知分支事务所在的节点的信息,所以需要RM主动上报自身节点的相关信息给TC,这样TC才能在后续二阶段提交或者回滚的时候,准确通知RM做出提交和回滚动作。因此,目前的方案中,一笔分布式事务的执行会涉及大量的TM、RM和TC之间的通信,这样会增加交易的执行时间,降低了事务的吞吐量。

发明内容

本申请的主要目的在于提供一种处理事务的方法、处理事务的装置和电子设备,以至少解决现有技术中一笔分布式事务的执行会涉及大量的TM、RM和TC之间的通信,这样会增加交易的执行时间,降低了事务的吞吐量的问题。

为了实现上述目的,根据本申请的一个方面,提供了一种处理事务的方法,包括:获取组合服务,其中,所述组合服务具有事务协调器TC的功能和事务管理器TM的功能,所述组合服务用于至少以下之一:维护全局事务、维护分支事务、开启所述全局事务、协调所述全局事务,所述组合服务中包括至少一个原子服务,所述原子服务是指执行单一服务的最小服务单元;获取请求报文信息,其中,所述请求报文信息为请求处理目标事务的信息;根据所述请求报文信息确定处理所述目标事务的至少一个目标原子服务;在所述组合服务和所述原子服务均已与数据库建立通信连接的情况下,将所述原子服务的信息存储至所述数据库中,以使得所述组合服务在所述目标原子服务处理所述目标事务前获取所述目标原子服务的信息,采用所述目标原子服务处理所述目标事务。

可选地,获取组合服务,包括:获取多个原子服务,并分别确定各所述原子服务的作用;获取多个事务,并确定处理各所述事务采用的至少一个所述原子服务;在处理所述事务采用的所述原子服务仅有一个的情况下,确定所述原子服务为所述组合服务;在处理所述事务采用的所述原子服务有多个的情况下,确定多个所述原子服务的执行顺序,将多个所述原子服务按照所述执行顺序进行组合,得到所述组合服务。

可选地,将所述原子服务的信息存储至所述数据库中,包括:在所述组合服务中包括所述全局事务的开启标识的情况下,生成全局事务标识,在所述数据库的第一数据表中插入所述全局事务的开启记录,其中,所述第一数据表中的主键是所述全局事务标识,所述全局事务的状态为开启状态,所述全局事务与所述目标事务对应,所述全局事务是指至少一个所述目标原子服务的信息的集合;在所述目标原子服务执行前,在所述数据库的第二数据表中插入所述目标原子服务的待执行记录,其中,所述第二数据表中的主键是所述全局事务标识和所述目标原子服务的待执行顺序组成的,所述目标原子服务的状态为初始化状态;在所述目标原子服务执行后,在所述数据库的第三数据表中插入所述目标原子服务的执行记录,其中,所述第三数据表中的主键是所述全局事务标识和所述目标原子服务的执行顺序组成的,所述目标原子服务的状态为已准备状态;采用所述目标原子服务处理所述目标事务,包括:采用所述目标原子服务处理所述目标事务,并更新所述第一数据表、所述第二数据表和所述第三数据表中的至少一个数据表的信息。

可选地,采用所述目标原子服务处理所述目标事务,并更新所述第一数据表、所述第二数据表和所述第三数据表中的至少一个数据表的信息,包括:基于所述请求报文信息,采用所述目标原子服务执行本地事务;在多个所述目标原子服务均已执行一次所述本地事务的情况下,采用所述组合服务将所述第一数据表中的所述全局事务的状态更新为正在委托状态;采用所述组合服务将委托请求发送至所述目标原子服务,采用所述目标原子服务基于所述委托请求,将所述第三数据表中的所述目标原子服务的状态更新为已委托状态;采用所述目标原子服务再次执行所述本地事务,采用所述组合服务将所述第一数据表中的所述全局事务的状态更新为已委托状态。

可选地,采用所述目标原子服务处理所述目标事务,并更新所述第一数据表、所述第二数据表和所述第三数据表中的至少一个数据表的信息,包括:在所述第二数据表的记录和所述第三数据表的记录不对应的情况下,确定所述目标原子服务异常;采用所述组合服务,根据所述第二数据表的记录对所述目标原子服务发起回滚请求,其中,所述回滚请求是指请求恢复所述目标原子服务上一次的执行记录,对所述目标事务回滚的请求;采用所述目标原子服务,基于所述第二数据表和所述第三数据表中的信息,确定是否需要回滚,在确定需要回滚的请求下,执行回滚操作,并至少更新所述第三数据表的信息,其中,所述回滚操作是指将所述目标原子服务恢复上一次的执行记录,对所述目标事务回滚的操作。

可选地,采用所述目标原子服务,基于所述第二数据表和所述第三数据表中的信息,确定是否需要回滚,在确定需要回滚的请求下,执行回滚操作,并至少更新所述第三数据表的信息,包括:根据所述第二数据表中的主键,确定所述第三数据表中是否有对应的主键;在所述第三数据表中没有与所述第二数据表中的主键对应的主键的情况下,确定所述目标事务未提交并且不需要回滚,在所述第三数据表插入所述目标原子服务的异常记录,所述异常记录中所述目标原子服务的状态为悬挂状态;在所述第三数据表中有与所述第二数据表中的主键对应的主键的情况下,确定所述目标事务已提交并且需要回滚;将所述第三数据表中所述目标原子服务的状态更新为已回滚状态,采用所述原子服务做回滚操作,并将所述第一数据表中的所述全局事务的状态更新为已回滚状态。

可选地,在采用所述目标原子服务处理所述目标事务之后,所述方法还包括:确定所述第一数据表中的信息、所述第二数据表中信息、所述第三数据表中的信息是否已更新;在所述第一数据表中的信息、所述第二数据表中信息、所述第三数据表中的信息均未更新的情况下,确定所述目标原子处理所述目标事务异常;采用异步服务重新执行所述目标事务,直到确定所述目标事务正常。

可选地,所述方法还包括:在采用所述异步服务重新执行所述目标事务的次数大于或者等于次数阈值的情况下,将所述第一数据表中的所述全局事务的状态更新为处理异常状态,并暂停处理所述目标事务。

根据本申请的另一方面,提供了一种处理事务的装置,包括:第一获取单元,用于获取组合服务,其中,所述组合服务具有事务协调器TC的功能和事务管理器TM的功能,所述组合服务用于至少以下之一:维护全局事务、维护分支事务、开启所述全局事务、协调所述全局事务,所述组合服务中包括至少一个原子服务,所述原子服务是指执行单一服务的最小服务单元;第二获取单元,用于获取请求报文信息,其中,所述请求报文信息为请求处理目标事务的信息;第一确定单元,用于根据所述请求报文信息确定处理所述目标事务的至少一个目标原子服务;第一处理单元,用于在所述组合服务和所述原子服务均已与数据库建立通信连接的情况下,将所述原子服务的信息存储至所述数据库中,以使得所述组合服务在所述目标原子服务处理所述目标事务前获取所述目标原子服务的信息,采用所述目标原子服务处理所述目标事务。

根据本申请的再一方面,提供了一种电子设备,包括:一个或多个处理器,存储器,以及一个或多个程序,其中,所述一个或多个程序被存储在所述存储器中,并且被配置为由所述一个或多个处理器执行,所述一个或多个程序包括用于执行任意一种所述的方法。

应用本申请的技术方案,可以使用组合服务组合TC和TM,这样无需再独立部署TC和TM了,可以缩短组合服务和原子服务通信的时间,并且在目标原子服务处理目标事务前就将目标原子服务的信息存储到数据库中了,组合服务可以在处理目标事务前确定目标原子服务以及目标原子服务的信息了,无需TC和TM之间的频繁通信,进而可以缩短交易的执行时间,提高了事务的吞吐量。

附图说明

构成本申请的一部分的说明书附图用来提供对本申请的进一步理解,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:

图1示出了在一些方案中的分布式事务提交过程的示意图;

图2示出了在一些方案中的分布式事务回滚过程的示意图;

图3示出了根据本申请的实施例中提供的一种执行处理事务的方法的移动终端的硬件结构框图;

图4示出了根据本申请的实施例提供的一种处理事务的方法的流程示意图;

图5示出了服务编排的示意图;

图6示出了基于服务编排的分布式事务功能的架构示意图;

图7示出了分布式事务提交成功的处理过程的示意图;

图8示出了分布式事务回滚成功的处理过程的示意图;

图9示出了采用异步服务重新执行目标事务的架构示意图;

图10示出了全局事务的状态的示意图;

图11示出了根据本申请的实施例提供的一种处理事务的装置的结构框图。

其中,上述附图包括以下附图标记:

102、处理器;104、存储器;106、传输设备;108、输入输出设备。

具体实施方式

需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本申请。

为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分的实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。

需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

为了便于描述,以下对本申请实施例涉及的部分名词或术语进行说明:

TCC:是分布式事务领域的解决方案之一,TCC模式是两阶段提交模型,全局事务由若干个子事务构成,子事务满足两阶段提交,每个子事务都需要实现3个方法:try方法实现资源的检测和预留,commit方法执行业务操作的提交,要求try成功,commit一定能成功;cancel方法将预留资源的释放。

本地事务:跟一个数据库连接绑定的数据库事务,不允许跨库,由数据库保障事务的原子性。

微服务架构:微服务架构(Microservice Architecture)是一种架构概念,该架构的特点是围绕业务领域组件来创建应用,这些应用可独立地进行开发、管理和迭代。在分散的组件中使用云架构和平台式部署、管理和服务功能,使产品交付变得更加简单。

事务协调器TC:维护全局和分支事务的状态,与TM、RM通信,驱动全局事务的提交和回滚,即seata的服务端。

事务管理器TM:与TC通信,开启全局事务、提交或回滚全局事务。

资源管理器RM:管理分支事务处理,与TC交互以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚,即执行原子服务的服务端。

防重:是指对于同一个分布式事务的同一个分支事务,重复去调用该分支事务的第二阶段接口,因此,要求TCC的二阶段Confirm和Cancel接口保证幂等,不会重复使用或者释放资源。如果幂等控制没有做好,很有可能导致资损等严重问题。

防悬挂:Try由于网络拥堵而超时,事务管理器生成回滚,触发Cancel接口,而最终又收到了Try接口调用,但是Cancel比Try先到。按照前面允许空回滚的逻辑,回滚会返回成功,事务管理器认为事务已回滚成功,则此时的Try接口不应该执行,否则会产生数据不一致。

空回滚:是指对于一个分布式事务,在没有调用TCC资源Try方法的情况下,调用了二阶段的Cancel方法,Cancel方法需要识别出这是一个空回滚,然后直接返回成功。

Seata是一种开源的分布式事务框架,支持SAGA、TCC两种分布式事务模型,是目前业界使用较多的开源分布式事务实现方案。Seata由TM、RM和TC三部分组成。

在微服务架构下,后台处理服务按照业务领域拆分和独立部署,数据也往往会按照业务领域水平或纵向拆分成多个库,一笔交易处理往往经过多次的远程服务调用,涉及对多个数据库的更新操作,传统的XA全局数据库事务通过两阶段提交,虽然能实现数据强一致,但是因为要在整个事务期间锁定资源而性能太差,在大部分高性能需求的场景下都无法使用,因此业界针对此类场景提出了柔性分布式事务解决方案,不要求时刻保证数据处于强一致状态,仅需保证事务最终一致性即可,TCC即是柔性方案其中的一种。

TM与TC通信,负责开启全局事务、提交或回滚全局事务。RM负责管理分支事务,与TC交互以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。TC维护全局和分支事务的状态,与TM、RM通信,驱动全局事务的提交和回滚

在一些方案中,分布式事务的提交过程如图1所示,包括以下步骤:

1、应用端调用TM的API,开启一个全局事务,上报全局事务开启事件给TC,TC生成唯一的全局事务ID,持久化登记全局事务记录入库,全局事务状态为Begin(开启状态),将全局事务ID返回给TM;

2、RM执行分支事务1前,预先上报分支事务1开启事件给TC;

3、RM执行分支事务1的Prepare(准备状态)操作成功,上报给TC,TC持久化分支事务1执行记录入库,初始状态为Prepared(已准备状态)

4、RM执行分支事务2前,预先上报分支事务开启事件给TC;

5、RM执行分支事务2的Prepare操作成功,上报给TC,TC持久化分支事务2的执行记录入库,初始状态为Prepared;

6、应用端调用TM的API,提交全局事务,TM上报给TC;

7、TC发送分支事务1提交事件给RM,RM执行应用端的Commit(委托状态)操作成功,TC更新分支事务1的状态为Committed(已委托状态);

8、TC发送分支事务2提交事件给RM,RM执行应用端的Commit操作成功,TC更新分支事务2的状态为Committed;

9、TC更新全局事务状态为Committed。

在一些方案中,分布式事务的回滚过程如图2所示,包括以下步骤:

1、应用端调用TM的API,开启一个全局事务,上报全局事务开启事件给TC,TC生成唯一的全局事务ID,持久化登记全局事务记录入库,全局事务状态为Begin,将全局事务ID返回给TM;

2、RM执行分支事务1前,预先上报分支事务1开启事件给TC;

3、RM执行分支事务1的Prepare操作成功,上报给TC,TC持久化分支事务1执行记录入库,初始状态为Prepared;

4、RM执行分支事务2前,预先上报分支事务开启事件给TC;

5、RM执行分支事务2的Prepare操作成功,上报给TC,TC持久化分支事务2的执行记录入库,初始状态为Prepared;

6、因为其他异常原因,应用端调用TM的API,回滚全局事务,TM上报给TC;

7、TC发送分支事务2回滚请求给RM,RM执行应用端的Cancel操作成功,TC更新分支事务2的状态为Rollbacked(已回滚状态);

8、TC发送分支事务1回滚请求给RM,RM执行应用端的Cancel操作成功,TC更新分支事务1的状态为Rollbacked;

9、TC更新全局事务状态为Rollbacked。

目前的方案中,一笔分布式事务的执行涉及大量的TM、RM和TC之间的通信,而远程通信涉及网络通信开销(需要注意的是,这里的远程并不指的是物理上的远程通信,而是服务之间的通信,有可能服务会部署在一个服务器上,也有可能服务会部署在不同的服务器上),增加了交易执行时间,会降低事务的吞吐量。

正如背景技术中所介绍的,现有技术中一笔分布式事务的执行会涉及大量的TM、RM和TC之间的通信,这样会增加交易的执行时间,降低了事务的吞吐量,为解决如上的问题,本申请的实施例提供了一种处理事务的方法、处理事务的装置和电子设备。

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述。

本申请实施例中所提供的方法实施例可以在移动终端、计算机终端或者类似的运算装置中执行。以运行在移动终端上为例,图3是本发明实施例的一种处理事务的方法的移动终端的硬件结构框图。如图3所示,移动终端可以包括一个或多个(图3中仅示出一个)处理器102(处理器102可以包括但不限于微处理器MCU或可编程逻辑器件FPGA等的处理装置)和用于存储数据的存储器104,其中,上述移动终端还可以包括用于通信功能的传输设备106以及输入输出设备108。本领域普通技术人员可以理解,图3所示的结构仅为示意,其并不对上述移动终端的结构造成限定。例如,移动终端还可包括比图3中所示更多或者更少的组件,或者具有与图3所示不同的配置。

存储器104可用于存储计算机程序,例如,应用软件的软件程序以及模块,如本发明实施例中的设备信息的显示方法对应的计算机程序,处理器102通过运行存储在存储器104内的计算机程序,从而执行各种功能应用以及数据处理,即实现上述的方法。存储器104可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储装置、闪存、或者其他非易失性固态存储器。在一些实例中,存储器104可进一步包括相对于处理器102远程设置的存储器,这些远程存储器可以通过网络连接至移动终端。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。传输设备106用于经由一个网络接收或者发送数据。上述的网络具体实例可包括移动终端的通信供应商提供的无线网络。在一个实例中,传输设备106包括一个网络适配器(Network Interface Controller,简称为NIC),其可通过基站与其他网络设备相连从而可与互联网进行通讯。在一个实例中,传输设备106可以为射频(Radio Frequency,简称为RF)模块,其用于通过无线方式与互联网进行通讯。

在本实施例中提供了一种运行于移动终端、计算机终端或者类似的运算装置的处理事务的方法,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。

图4是根据本申请实施例的一种处理事务的方法的流程示意图。如图4所示,该方法包括以下步骤:

步骤S201,获取组合服务,其中,上述组合服务具有事务协调器TC的功能和事务管理器TM的功能,上述组合服务用于至少以下之一:维护全局事务、维护分支事务、开启上述全局事务、协调上述全局事务,上述组合服务中包括至少一个原子服务,上述原子服务是指执行单一服务的最小服务单元;

具体地,可以将TC和TM进行组合,得到组合服务,组合服务具有TC的功能和TM的功能,这样就只涉及到组合服务和RM之间的通信了,不需要TC、TM和RM三方的通信,进而可以缩短处理事务的时间。

步骤S202,获取请求报文信息,其中,上述请求报文信息为请求处理目标事务的信息;

具体地,请求报文可以是终端发送过来的,还可以是其他的服务器发送过来的,还可以是其他的系统发送过来的,事务有很多种,发送过来的请求报文信息包括发送端需要处理的目标事务。

步骤S203,根据上述请求报文信息确定处理上述目标事务的至少一个目标原子服务;

具体地,处理不同的事务是要采用不同的原子服务的,因此可以确定处理目标事务采用的目标原子服务,进而采用目标原子服务来处理目标事务。

步骤S204,在上述组合服务和上述原子服务均已与数据库建立通信连接的情况下,将上述原子服务的信息存储至上述数据库中,以使得上述组合服务在上述目标原子服务处理上述目标事务前获取上述目标原子服务的信息,采用上述目标原子服务处理上述目标事务。

具体地,原子服务的信息包括以下至少之一:服务器IP、服务端口、请求报文。

具体地,在目标原子服务处理目标事务之前采用数据库存储目标原子服务的有关的信息,这样组合服务可以在目标原子服务处理目标事务之前,从数据库中获取信息,就可以确定处理该目标事务所采用的目标原子服务的信息了,无需RM在处理目标事务后才向TC返回执行的记录,进一步缩短了交易的执行时间。

通过本实施例,可以使用组合服务组合TC和TM,这样无需再独立部署TC和TM了,可以缩短组合服务和原子服务通信的时间,并且在目标原子服务处理目标事务前就将目标原子服务的信息存储到数据库中了,组合服务可以在处理目标事务前确定目标原子服务以及目标原子服务的信息了,无需TC和TM之间的频繁通信,进而可以缩短交易的执行时间,提高了事务的吞吐量。

组合服务是根据原子服务得到的,可以使用服务编排的方式编排原子服务得到组合服务,具体实现过程中,获取组合服务,可以通过以下步骤实现:获取多个原子服务,并分别确定各上述原子服务的作用;获取多个事务,并确定处理各上述事务采用的至少一个上述原子服务;在处理上述事务采用的上述原子服务仅有一个的情况下,确定上述原子服务为上述组合服务;在处理上述事务采用的上述原子服务有多个的情况下,确定多个上述原子服务的执行顺序,将多个上述原子服务按照上述执行顺序进行组合,得到上述组合服务。

该方案中,可以先确定不同的原子服务的作用,例如有的原子服务是用于扣款的,有的原子服务是用于锁定用户账户的,有的原子服务是用于查询账号的,这样先确定原子服务的作用(或者功能),再确定处理不同的事务采用的至少一个原子服务,这样就可以确定处理事务需要的原子服务具体有哪些,进而将事务和原子服务进行绑定,进而得到了组合服务,这样后续可以使用组合服务和原子服务来更高效地处理事务,同时由于处理事务只涉及到原子服务和组合服务这两个服务,这样也可以进一步缩短处理事务的时间。

具体地,可以使用图形化服务编排的方式编排原子服务形成一个组合服务,服务编排文件可以是一个XML文件,可由电子集成驱动器(Integrated Drive Electronics,简称IDE)拖拉拽的方式开发服务编排文件(在编排文件中原子服务仅需指定服务名,并配置输入输出映射转换器,制定需要转换的服务类型),当然可以支持顺序、分支、循环、并行等方式调用原子服务。组合服务可以借助服务编排引擎解析服务编排文件,根据分支条件判断依次执行的原子服务的执行顺序。

如图5所示,例如,原子服务有4个,分别是原子服务A、原子服务B、原子服务C、原子服务D,原子服务A的作用是A功能,原子服务B的作用是B功能,原子服务C的作用是C功能,原子服务D的作用是D功能,在处理A事务时采用的原子服务有原子服务A、原子服务B、原子服务D,在处理B事务时采用的原子服务有原子服务A、原子服务C、原子服务D,因此,将原子服务A、原子服务B、原子服务D与A事务绑定,将原子服务A、原子服务C、原子服务D与B事务绑定,后续如果接收到的目标事务时A事务,可以直接确定所需要的原子服务有原子服务A、原子服务B、原子服务D了。

本方案中,组合服务将TC和TM合二为一,由组合服务的引擎作为事务管理器和事务协调器,组合服务可以提供全局事务开启的功能,以及全局事务协调的功能,根据服务编排时记录的执行顺序,开启全局事务、并依次做分支事务的准备、提交和回滚。由原子服务的引擎作为资源管理器,提供分支事务的开启、提交、回滚、防重和防悬挂功能。

具体地,如图6所示,本方案中包括一个组合服务、多个原子服务、多个数据库,一个原子服务分别和一个数据库通信,组合服务也和一个数据库通信,组合服务在数据库中记录全局事务的状态以及分支事务的执行记录,组合服务对多个原子服务进行服务编排和调用,原子服务执行分支事务,并在与其通信的数据库中记录分支事务的状态。

为了保证后续组合服务可以获取到全局事务的状态,以及在目标原子执行前获取目标原子的信息,在目标原子执行后获取目标原子的信息,在目标原子处理事务后实时对目标原子的信息进行更新,本申请的将上述原子服务的信息存储至上述数据库中,可以通过以下步骤实现:在上述组合服务中包括上述全局事务的开启标识的情况下,生成全局事务标识,在上述数据库的第一数据表中插入上述全局事务的开启记录,其中,上述第一数据表中的主键是上述全局事务标识,上述全局事务的状态为开启状态,上述全局事务与上述目标事务对应,上述全局事务是指至少一个上述目标原子服务的信息的集合;在上述目标原子服务执行前,在上述数据库的第二数据表中插入上述目标原子服务的待执行记录,其中,上述第二数据表中的主键是上述全局事务标识和上述目标原子服务的待执行顺序组成的,上述目标原子服务的状态为初始化状态;在上述目标原子服务执行后,在上述数据库的第三数据表中插入上述目标原子服务的执行记录,其中,上述第三数据表中的主键是上述全局事务标识和上述目标原子服务的执行顺序组成的,上述目标原子服务的状态为已准备状态;采用上述目标原子服务处理上述目标事务,可以通过以下步骤实现:采用上述目标原子服务处理上述目标事务,并更新上述第一数据表、上述第二数据表和上述第三数据表中的至少一个数据表的信息。

该方案中,可以采用第一数据表存储全局事务的信息,在目标原子服务处理目标事务之前采用第二数据表存储目标原子服务的与待执行的记录有关的信息,在目标原子服务处理目标事务之后采用第三数据表存储目标原子服务的与已执行的记录有关的信息,这样组合服务可以在目标原子服务处理目标事务之前,从第二数据表中获取信息,就可以确定处理该目标事务所采用的目标原子服务的信息了,无需RM在处理目标事务后才向TC返回执行的记录,进一步缩短了交易的执行时间,并且后续也可以采用第三数据表来对目标原子服务的执行顺序来对处理目标事务的情况进行验证,保证处理过程的准确性较高,同时还可以对至少一个数据表的信息更新,以保证数据表中的信息的实时性较好。

具体地,在组合服务执行的过程中,若发现服务编排中存在全局事务的开启标识的情况下,可以生成全局事务ID,在第一数据表(数据库全局事务登记表,表名为TxnLog)中插入一条全局事务的开启记录,主键是全局事务ID,初始全局事务状态为Begin。

当组合服务执行过程中遇到目标原子服务的节点,在目标原子服务执行前,在第二数据表(数据库交易执行记录表,表明为RunLog)中插入一条目标原子服务的待执行记录,由全局事务ID和服务编排执行序号(目标原子服务的执行顺序)作为联合主键,初始状态为INIT(初始化状态),同时在RunLog中插入目标原子服务寻址所需要的必要信息。

目标原子服务启动时均向服务注册中心注册,如果目标原子服务没有分单元部署,则只需要知道目标原子服务名即可从服务注册中心获取目标服务地址。如果目标原子服务分库分单元部署,如按照客户维度分库,每个单元部署4个数据库,则可以根据请求报文里的客户信息访问全局路由服务,获取目标数据库,再根据数据库和单元映射配置找到目标单元,从而找到目标服务的寻址相关信息并登记入库,为后续组合服务发起分支事务提交或回滚动作做准备。即在分库分单元部署的场景下,部署单独的全局路由服务,根据交易请求报文中的关键业务信息寻找并返回客户ID,单元ID等服务寻址信息,在不需要分库分单元部署的场景下,依靠服务注册中心实现服务寻址。

本方案整合了TC和TM,不需要独立部署TC,采用服务编排,加上全局路由服务和服务注册中心的服务寻址能力,即可实现可靠的分布式事务,TC不再需要和RM频繁的远程通信,提升了分布式事务的效率和可靠性。

目标原子服务在前处理步骤中开启了本地事务,在目标原子服务执行Prepare业务操作成功后,同本地事务在第三数据表(分支事务状态表,表名为BranchLog)中插入一条记录,BranchLog表的主键和RunLog表的主键相同,也是全局事务ID和服务编排执行序号,初始状态为PrePared,插入记录成功后本地事务提交。

RunLog表由全局事务ID和服务编排执行序号作为联合主键,记录原子服务名、单元ID、原子服务请求报文等信息,以备后续二阶段提交和回滚时有迹可循。组合服务在原子服务一阶段Try动作执行前即提前登记RunLog记录,初始状态为INIT,二阶段同步提交成功或回滚成功后,不更新该表中的事务的状态,仅在异步提交成功后才会更新该表中的事务的状态为Committed,异步回滚成功后更新为Rollbacked,异步操作失败不更新该表中的事务的状态。

BranchLog表的主键是全局事务ID和服务编排执行序号,分支事务Prepare操作成功后,在原子服务后处理中,与Prepare业务操作同本地事务插入状态为Prepared的记录,如果插入时主键冲突,则本地事务提交失败只能回滚,可以防止Prepare重复执行。在收到组合服务发来Commit请求后,原子服务前处理中检查该表同主键记录,如果找不到记录,则说明一阶段Prepare操作尚未执行,不可以做二阶段Commit;如果找到一条Committed的记录,说明该分支事务已经提交过了,不需要二次提交;如果找到一条Suspended或者Rollbacked的记录,说明该分支事务已经回滚或回滚先于一阶段Prepare到来,也不可以提交;只有找到一笔Prepared状态的记录,才允许提交。同理,如果原子服务收到来自组合服务的回滚请求后,也会查这张表来确认分支事务的状态,只有Prepared状态的记录可以指定回滚业务动作,回滚成功后更新状态为Rollbacked;如果找不到记录,说明回滚先于Prepare动作到来,向该表插一条Suspended状态的记录,标识为分支事务悬挂,不需要回滚;如果找到一条Rollbacked状态的记录,说明分支事务已经回滚,不需要二次回滚;如果找到一条Committed状态的记录,说明分支事务已经提交,不允许回滚。通过运用这张表,可以防重、防空回滚和防悬挂。

对于目标原子服务的处理目标事务的过程,可以是目标原子服务提交本地事务的方式来处理的,并且每次处理目标事务后,还可以对至少一个数据表的信息进行更新,在一些实施例上,采用上述目标原子服务处理上述目标事务,并更新上述第一数据表、上述第二数据表和上述第三数据表中的至少一个数据表的信息,具体可以通过以下步骤实现:基于上述请求报文信息,采用上述目标原子服务执行本地事务;在多个上述目标原子服务均已执行一次上述本地事务的情况下,采用上述组合服务将上述第一数据表中的上述全局事务的状态更新为正在委托状态;采用上述组合服务将委托请求发送至上述目标原子服务,采用上述目标原子服务基于上述委托请求,将上述第三数据表中的上述目标原子服务的状态更新为已委托状态;采用上述目标原子服务再次执行上述本地事务,采用上述组合服务将上述第一数据表中的上述全局事务的状态更新为已委托状态。

该方案中,目标原子服务可以使用两次执行(提交)本地事务的方式来处理目标事务,例如,如果要更新用户账户余额,第一次执行本地事务是先锁定用户账户,第二次执行本地事务是更新账户余额,即执行本地事务一步一步来的,当然也可以同步一次执行完,直接使用目标原子服务来处理目标事务,这样无需RM和TC之间来回通信,进一步缩短了交易的执行时间,同时还可以对至少一个数据表的信息更新,以进一步保证数据表中的信息的实时性较好。

具体地,在所有的目标原子服务执行成功后,组合服务将述第一数据表中的全局事务的状态更新为Committing(正在委托状态),组合服务生成Commit(委托)请求,并发送至目标原子服务,目标原子服务检查第三数据表,更新分支事务的状态,将目标原子服务的状态从Prepared更新为Committed,目标原子服务的commit业务操作成功后,本地事务再次提交,组合服务将第一数据表中的全局事务的状态更新为Committed。

具体地,分布式事务提交成功的处理过程如图7所示,圆形的步骤是组合服务执行的,菱形的步骤的原子服务执行的,包括如下步骤:

1、组合服务执行过程中,若发现服务编排中存在全局事务的开启标识的情况下,可以生成全局事务ID,在第一数据表(数据库全局事务登记表,表名为TxnLog)中插入一条全局事务的开启记录(组合服务的前处理步骤);

2、当组合服务执行过程中遇到目标原子服务的节点,在目标原子服务执行前,在第二数据表(数据库交易执行记录表,表名为RunLog)中插入一条目标原子服务的待执行记录(本步骤对应的是目标原子服务1);

3、目标原子服务在前处理步骤中开启了本地事务,在目标原子服务执行Prepare业务操作成功后,同本地事务在第三数据表(分支事务状态表,表名为BranchLog)中插入一条记录,插入记录成功后本地事务提交(目标原子服务1的后处理步骤);

4、同步骤2,对应的是目标原子服务2;

5、同步骤3,对应的是目标原子服务2;

6、在所有的目标原子服务执行成功后,组合服务将述第一数据表中的全局事务的状态更新为Committing(组合服务的后处理步骤);

7、组合服务生成Commit(委托)请求,并发送至目标原子服务,目标原子服务检查第三数据表,更新分支事务的状态,将目标原子服务的状态从Prepared更新为Committed(目标原子服务1的前处理步骤);

8、目标原子服务的commit业务操作成功后,本地事务再次提交(目标原子服务2的前处理步骤);

9、同步骤7,对应的是目标原子服务2;

10、同步骤8,对应的是目标原子服务2;

11、组合服务将第一数据表中的全局事务的状态更新为Committed(组合服务的后处理步骤)。

对于目标原子服务的处理目标事务的过程,如何目标原子服务处理异常,是可以进行补救的,可以对目标事务执行回滚操作,具体实现过程中,采用上述目标原子服务处理上述目标事务,并更新上述第一数据表、上述第二数据表和上述第三数据表中的至少一个数据表的信息,可以通过以下步骤实现:在上述第二数据表的记录和上述第三数据表的记录不对应的情况下,确定上述目标原子服务异常;采用上述组合服务,根据上述第二数据表的记录对上述目标原子服务发起回滚请求,其中,上述回滚请求是指请求恢复上述目标原子服务上一次的执行记录,对上述目标事务回滚的请求;采用上述目标原子服务,基于上述第二数据表和上述第三数据表中的信息,确定是否需要回滚,在确定需要回滚的请求下,执行回滚操作,并至少更新上述第三数据表的信息,其中,上述回滚操作是指将上述目标原子服务恢复上一次的执行记录,对上述目标事务回滚的操作。

该方案中,如果目标原子服务异常,可以先根据第二数据表和第三数据表中的信息来确定是否需要执行回滚操作,只有在确定需要执行回滚操作的情况下,才会执行回滚操作,直接使用目标原子服务来做回滚操作,这样无需RM和TC之间来回通信,进一步缩短了交易的执行时间,同时还可以对至少一个数据表的信息更新,以进一步保证数据表中的信息的实时性较好。

对于确定是否需要回滚的条件,可以是根据第二数据表中的信息和第三数据表中的信息来确定的,在一些实施例上,采用上述目标原子服务,基于上述第二数据表和上述第三数据表中的信息,确定是否需要回滚,在确定需要回滚的请求下,执行回滚操作,并至少更新上述第三数据表的信息,可以通过以下步骤实现:根据上述第二数据表中的主键,确定上述第三数据表中是否有对应的主键;在上述第三数据表中没有与上述第二数据表中的主键对应的主键的情况下,确定上述目标事务未提交并且不需要回滚,在上述第三数据表插入上述目标原子服务的异常记录,上述异常记录中上述目标原子服务的状态为悬挂状态;在上述第三数据表中有与上述第二数据表中的主键对应的主键的情况下,确定上述目标事务已提交并且需要回滚;将上述第三数据表中上述目标原子服务的状态更新为已回滚状态,采用上述原子服务做回滚操作,并将上述第一数据表中的上述全局事务的状态更新为已回滚状态。

该方案中,由于第二数据表中的信息是在目标原子服务执行前就已经存在了,因此直接将第三数据表中的信息和第二数据表中的信息进行比较,将第二数据表中的信息作为参考信息,可以确定出第三数据表中的信息是否与第二数据表中的信息不对应,进而可以较为准确地确定出目标原子服务是否已经提交过事务了,进而可以根据比较结果来确定是否需要执行回滚操作,在需要执行回滚操作的情况下,采用目标原子服务做回滚操作,目标原子服务可以重新提交事务,这样保证了本方案可以较为高效且准确地处理目标事务,避免出现处理异常。

具体地,在目标原子服务Prepare操作发生异常(判断条件可以根据实际情况设定,例如要锁定账户,但是没有锁定成功),本地事务回滚,发现第三数据表中无记录,组合服务根据第二数据表的记录,逆序发起对PBS(一个批处理作业和计算机系统资源管理软件包)的回滚操作(即对目标原子服务发起回滚)。目标原子服务检查第三数据表,根据主键没有找到对应的记录,说明分支事务未提交,不需要回滚,在第三数据表中插入一条记录,目标原子服务的状态改为Suspended(悬挂状态),如果目标原子服务检查第三数据表,根据主键找到了对应的记录,说明分支事务已提交,需要回滚,将目标原子服务的状态更新为Rollbacked,同事务执行业务回滚操作,回滚成功后提交本地事务,组合服务将第一数据表中的全局事务的状态更新为Rollbacked。

具体地,分布式事务提交成功的处理过程如图8所示,圆形的步骤是组合服务执行的,菱形的步骤的原子服务执行的,包括如下步骤:

1、组合服务执行过程中,若发现服务编排中存在全局事务的开启标识的情况下,可以生成全局事务ID,在第一数据表(数据库全局事务登记表,表名为TxnLog)中插入一条全局事务的开启记录(组合服务的前处理步骤);

2、当组合服务执行过程中遇到目标原子服务的节点,在目标原子服务执行前,在第二数据表(数据库交易执行记录表,表名为RunLog)中插入一条目标原子服务的待执行记录(本步骤对应的是目标原子服务1);

3、目标原子服务在前处理步骤中开启了本地事务,在目标原子服务执行Prepare业务操作成功后,同本地事务在第三数据表(分支事务状态表,表名为BranchLog)中插入一条记录,插入记录成功后本地事务提交(目标原子服务1的后处理步骤);

4、同步骤2,对应的是目标原子服务2,但目标原子服务Prepare操作发生异常,本地事务回滚,第三数据表无记录;

5、组合服务根据RunLog记录,逆序发起对PBS的回滚操作(组合服务的异常处理步骤);

6、目标原子服务2收到组合服务发来的回滚请求,在前处理中检查BranchLog,根据主键没有找到记录,说明本分支事务一阶段操作未提交,不需要回滚,同事务向BranchLog插一条记录,状态为Suspended(目标原子服务2的前处理步骤);

7、目标原子服务1收到组合服务发来的回滚请求,在前处理中检查分支事务状态表BranchLog,根据主键找到一条Prepared状态的记录,说明本分支事务一阶段操作已提交,需要回滚,更新BranchLog记录为Rollbacked,同事务执行业务回滚动作(目标原子服务1的前处理步骤);

8、回滚成功后提交本地事务(目标原子服务1的后处理步骤);

9、组合服务将第一数据表中的全局事务的状态更新为Rollbacked(组合服务的异常处理步骤)。

组合服务可以对目标原子服务做二阶段同步提交或者回滚操作,但是有些场景下,同步提交或者回滚也会失败,例如有的情况下服务器断电或者宕机,二阶段同步尝试没有机会执行,此时可以部署一个异步服务,做异步的处理,在采用上述目标原子服务处理上述目标事务之后,上述方法还包括以下步骤:确定上述第一数据表中的信息、上述第二数据表中信息、上述第三数据表中的信息是否已更新;在上述第一数据表中的信息、上述第二数据表中信息、上述第三数据表中的信息均未更新的情况下,确定上述目标原子处理上述目标事务异常;采用异步服务重新执行上述目标事务,直到确定上述目标事务正常。

该方案中,为了避免多次提交和回滚都失败导致目标事务无法正常处理,可以部署一个异步服务,通过异步服务来重新执行目标事务,进而保证目标事务可以正常执行。

为了避免异步服务执行次数过多导致出现异常情况,上述方法还包括以下步骤:在采用上述异步服务重新执行上述目标事务的次数大于或者等于次数阈值的情况下,将上述第一数据表中的上述全局事务的状态更新为处理异常状态,并暂停处理上述目标事务。

该方案中,如果异步服务多次执行目标事务都出现异常,那么异步服务还会重新再处理目标事务,这样如果执行次数过多的话会导致整机或者整个系统异常,因此可以对异步服务执行目标事务的次数进行限定,一旦超过次数阈值了,那么可以不继续处理目标事务了,避免了资源的浪费。

具体地,针对采用异步服务重新执行目标事务的具体描述如图9所示,针对断电、技术异常等原因导致的交易同步提交或回滚不成功,由Timer(异步服务)异步发起提交和回滚重试;Timer服务多实例高可用部署,实例无状态,多实例抢锁处理任务,任意Timer服务实例宕机可由其他健康实例(其他的异步服务)继续处理;Timer抽取第一数据表中状态为Begin,且执行时间已超时的交易插入到事务登记簿做异步回滚,抽取第一数据表中事务状态为Committing,且执行时间已超时的交易插入到事务登记簿做异步提交,异步提交和回滚操作均支持重试。每当有一个分支事务被异步提交成功后,对应RunLog的记录被更新为Committed,所有分支事务都被提交成功,则TxnLog里的全局事务状态被更新为Committed。同理,每当有一个分支事务被回滚成功后,对应的RunLog记录被更新为Rollbacked,所有分支事务被回滚成功后,则TxnLog里的全局事务状态被更新为Rollbacked。异步处理有重试次数上限,当达到重试次数阈值还没有提交成功,则TxnLog里的全局事务状态更新为CommitFailed(提交异常状态);同理,当达到重试次数阈值还没有回滚成功,则TxnLog里的全局事务状态更新为RollbackFailed(回滚异常状态);对于CommitFailed和RollbackFailed状态的记录,需要人工干预。

更为具体地,本方案的全局事务的状态如图10所示,从第一数据表中抽取状态为Begin的事务,如果Prepare失败且超时,但是同步Rollback(回滚)成功的情况下,将事务的状态改为Rollbacked;如果Prepare失败且超时,同步Rollback(回滚)失败的情况下,Timer服务从第一数据表中事务状态为Rollbacking(正在回滚)的事务,Timer服务重复执行Rollback,如果次数小于或者等于6次同步Rollback成功,将事务的状态改为Rollbacked,如果次数大于或者等于6次同步Rollback失败,确定Timer服务同步Rollback失败,将TxnLog里的全局事务状态被更新为RollbackFailed。

如果Prepare成功,从第一数据表中事务状态为Committing的事务,如果同步commit成功,将事务的状态改为Committed,如果同步commit失败,Timer服务从第一数据表中事务状态为Committing的事务,Timer服务重复执行commit,如果次数小于或者等于6次同步commit成功,将事务的状态改为Committed,如果次数大于或者等于6次同步commit失败,确定Timer服务同步commit失败,将TxnLog里的全局事务状态被更新为CommitFailed。

本申请实施例还提供了一种处理事务的装置,需要说明的是,本申请实施例的处理事务的装置可以用于执行本申请实施例所提供的用于处理事务的方法。该装置用于实现上述实施例及优选实施方式,已经进行过说明的不再赘述。如以下所使用的,术语“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。

以下对本申请实施例提供的处理事务的装置进行介绍。

图11是根据本申请实施例的一种处理事务的装置的结构框图。如图11所示,该装置包括:

第一获取单元10,用于获取组合服务,其中,上述组合服务具有事务协调器TC的功能和事务管理器TM的功能,上述组合服务用于至少以下之一:维护全局事务、维护分支事务、开启上述全局事务、协调上述全局事务,上述组合服务中包括至少一个原子服务,上述原子服务是指执行单一服务的最小服务单元;

第二获取单元20,用于获取请求报文信息,其中,上述请求报文信息为请求处理目标事务的信息;

第一确定单元30,用于根据上述请求报文信息确定处理上述目标事务的至少一个目标原子服务;

第一处理单元40,用于在上述组合服务和上述原子服务均已与数据库建立通信连接的情况下,将上述原子服务的信息存储至上述数据库中,以使得上述组合服务在上述目标原子服务处理上述目标事务前获取上述目标原子服务的信息,采用上述目标原子服务处理上述目标事务。

通过本实施例,可以使用组合服务组合TC和TM,这样无需再独立部署TC和TM了,可以缩短组合服务和原子服务通信的时间,并且在目标原子服务处理目标事务前就将目标原子服务的信息存储到数据库中了,组合服务可以在处理目标事务前确定目标原子服务以及目标原子服务的信息了,无需TC和TM之间的频繁通信,进而可以缩短交易的执行时间,提高了事务的吞吐量。

组合服务是根据原子服务得到的,可以使用服务编排的方式编排原子服务得到组合服务,具体实现过程中,第一获取单元包括第一获取模块、第二获取模块、确定模块和第一处理模块,第一获取模块用于获取多个原子服务,并分别确定各上述原子服务的作用;第二获取模块用于获取多个事务,并确定处理各上述事务采用的至少一个上述原子服务;确定模块用于在处理上述事务采用的上述原子服务仅有一个的情况下,确定上述原子服务为上述组合服务;第一处理模块用于在处理上述事务采用的上述原子服务有多个的情况下,确定多个上述原子服务的执行顺序,将多个上述原子服务按照上述执行顺序进行组合,得到上述组合服务。

该方案中,可以先确定不同的原子服务的作用,例如有的原子服务是用于扣款的,有的原子服务是用于锁定用户账户的,有的原子服务是用于查询账号的,这样先确定原子服务的作用(或者功能),再确定处理不同的事务采用的至少一个原子服务,这样就可以确定处理事务需要的原子服务具体有哪些,进而将事务和原子服务进行绑定,进而得到了组合服务,这样后续可以使用组合服务和原子服务来更高效地处理事务,同时由于处理事务只涉及到原子服务和组合服务这两个服务,这样也可以进一步缩短处理事务的时间。

为了保证后续组合服务可以获取到全局事务的状态,以及在目标原子执行前获取目标原子的信息,在目标原子执行后获取目标原子的信息,在目标原子处理事务后实时对目标原子的信息进行更新,第一处理单元包括第二处理模块、第三处理模块、第四处理模块和第五处理模块,第二处理模块用于在上述组合服务中包括上述全局事务的开启标识的情况下,生成全局事务标识,在上述数据库的第一数据表中插入上述全局事务的开启记录,其中,上述第一数据表中的主键是上述全局事务标识,上述全局事务的状态为开启状态,上述全局事务与上述目标事务对应,上述全局事务是指至少一个上述目标原子服务的信息的集合;第三处理模块用于在上述目标原子服务执行前,在上述数据库的第二数据表中插入上述目标原子服务的待执行记录,其中,上述第二数据表中的主键是上述全局事务标识和上述目标原子服务的待执行顺序组成的,上述目标原子服务的状态为初始化状态;第四处理模块用于在上述目标原子服务执行后,在上述数据库的第三数据表中插入上述目标原子服务的执行记录,其中,上述第三数据表中的主键是上述全局事务标识和上述目标原子服务的执行顺序组成的,上述目标原子服务的状态为已准备状态;第五处理模块用于采用上述目标原子服务处理上述目标事务,并更新上述第一数据表、上述第二数据表和上述第三数据表中的至少一个数据表的信息。

该方案中,可以采用第一数据表存储全局事务的信息,在目标原子服务处理目标事务之前采用第二数据表存储目标原子服务的与待执行的记录有关的信息,在目标原子服务处理目标事务之后采用第三数据表存储目标原子服务的与已执行的记录有关的信息,这样组合服务可以在目标原子服务处理目标事务之前,从第二数据表中获取信息,就可以确定处理该目标事务所采用的目标原子服务的信息了,无需RM在处理目标事务后才向TC返回执行的记录,进一步缩短了交易的执行时间,并且后续也可以采用第三数据表来对目标原子服务的执行顺序来对处理目标事务的情况进行验证,保证处理过程的准确性较高,同时还可以对至少一个数据表的信息更新,以保证数据表中的信息的实时性较好。

对于目标原子服务的处理目标事务的过程,可以是目标原子服务提交本地事务的方式来处理的,并且每次处理目标事务后,还可以对至少一个数据表的信息进行更新,在一些实施例上,第五处理模块包括第一处理子模块、第二处理子模块、第三处理子模块和第四处理子模块,第一处理子模块用于基于上述请求报文信息,采用上述目标原子服务执行本地事务;第二处理子模块用于在多个上述目标原子服务均已执行一次上述本地事务的情况下,采用上述组合服务将上述第一数据表中的上述全局事务的状态更新为正在委托状态;第三处理子模块用于采用上述组合服务将委托请求发送至上述目标原子服务,采用上述目标原子服务基于上述委托请求,将上述第三数据表中的上述目标原子服务的状态更新为已委托状态;第四处理子模块用于采用上述目标原子服务再次执行上述本地事务,采用上述组合服务将上述第一数据表中的上述全局事务的状态更新为已委托状态。

该方案中,目标原子服务可以使用两次执行(提交)本地事务的方式来处理目标事务,例如,如果要更新用户账户余额,第一次执行本地事务是先锁定用户账户,第二次执行本地事务是更新账户余额,即执行本地事务一步一步来的,当然也可以同步一次执行完,直接使用目标原子服务来处理目标事务,这样无需RM和TC之间来回通信,进一步缩短了交易的执行时间,同时还可以对至少一个数据表的信息更新,以进一步保证数据表中的信息的实时性较好。

对于目标原子服务的处理目标事务的过程,如何目标原子服务处理异常,是可以进行补救的,可以对目标事务执行回滚操作,具体实现过程中,第五处理模块包括确定子模块、第五处理子模块和第六处理子模块,确定子模块用于在上述第二数据表的记录和上述第三数据表的记录不对应的情况下,确定上述目标原子服务异常;第五处理子模块用于采用上述组合服务,根据上述第二数据表的记录对上述目标原子服务发起回滚请求,其中,上述回滚请求是指请求恢复上述目标原子服务上一次的执行记录,对上述目标事务回滚的请求;第六处理子模块用于采用上述目标原子服务,基于上述第二数据表和上述第三数据表中的信息,确定是否需要回滚,在确定需要回滚的请求下,执行回滚操作,并至少更新上述第三数据表的信息,其中,上述回滚操作是指将上述目标原子服务恢复上一次的执行记录,对上述目标事务回滚的操作。

该方案中,如果目标原子服务异常,可以先根据第二数据表和第三数据表中的信息来确定是否需要执行回滚操作,只有在确定需要执行回滚操作的情况下,才会执行回滚操作,直接使用目标原子服务来做回滚操作,这样无需RM和TC之间来回通信,进一步缩短了交易的执行时间,同时还可以对至少一个数据表的信息更新,以进一步保证数据表中的信息的实时性较好。

对于确定是否需要回滚的条件,可以是根据第二数据表中的信息和第三数据表中的信息来确定的,在一些实施例上,第六处理子模块还用于根据上述第二数据表中的主键,确定上述第三数据表中是否有对应的主键;第六处理子模块还用于在上述第三数据表中没有与上述第二数据表中的主键对应的主键的情况下,确定上述目标事务未提交并且不需要回滚,在上述第三数据表插入上述目标原子服务的异常记录,上述异常记录中上述目标原子服务的状态为悬挂状态;第六处理子模块还用于在上述第三数据表中有与上述第二数据表中的主键对应的主键的情况下,确定上述目标事务已提交并且需要回滚;将上述第三数据表中上述目标原子服务的状态更新为已回滚状态,采用上述原子服务做回滚操作,并将上述第一数据表中的上述全局事务的状态更新为已回滚状态。

该方案中,由于第二数据表中的信息是在目标原子服务执行前就已经存在了,因此直接将第三数据表中的信息和第二数据表中的信息进行比较,将第二数据表中的信息作为参考信息,可以确定出第三数据表中的信息是否与第二数据表中的信息不对应,进而可以较为准确地确定出目标原子服务是否已经提交过事务了,进而可以根据比较结果来确定是否需要执行回滚操作,在需要执行回滚操作的情况下,采用目标原子服务做回滚操作,目标原子服务可以重新提交事务,这样保证了本方案可以较为高效且准确地处理目标事务,避免出现处理异常。

组合服务可以对目标原子服务做二阶段同步提交或者回滚操作,但是有些场景下,同步提交或者回滚也会失败,例如有的情况下服务器断电或者宕机,二阶段同步尝试没有机会执行,此时可以部署一个异步服务,做异步的处理,上述装置还包括第二确定单元、第三确定单元和第二处理单元,第二确定单元用于在采用上述目标原子服务处理上述目标事务之后,确定上述第一数据表中的信息、上述第二数据表中信息、上述第三数据表中的信息是否已更新;第三确定单元用于在上述第一数据表中的信息、上述第二数据表中信息、上述第三数据表中的信息均未更新的情况下,确定上述目标原子处理上述目标事务异常;第二处理单元用于采用异步服务重新执行上述目标事务,直到确定上述目标事务正常。

该方案中,为了避免多次提交和回滚都失败导致目标事务无法正常处理,可以部署一个异步服务,通过异步服务来重新执行目标事务,进而保证目标事务可以正常执行。

为了避免异步服务执行次数过多导致出现异常情况,上述装置还包括第三处理单元,第三处理单元用于在采用上述异步服务重新执行上述目标事务的次数大于或者等于次数阈值的情况下,将上述第一数据表中的上述全局事务的状态更新为处理异常状态,并暂停处理上述目标事务。

该方案中,如果异步服务多次执行目标事务都出现异常,那么异步服务还会重新再处理目标事务,这样如果执行次数过多的话会导致整机或者整个系统异常,因此可以对异步服务执行目标事务的次数进行限定,一旦超过次数阈值了,那么可以不继续处理目标事务了,避免了资源的浪费。

上述处理事务的装置包括处理器和存储器,上述第一获取单元、第二获取单元、第一确定单元和第一处理单元等均作为程序单元存储在存储器中,由处理器执行存储在存储器中的上述程序单元来实现相应的功能。上述模块均位于同一处理器中;或者,上述各个模块以任意组合的形式分别位于不同的处理器中。

处理器中包含内核,由内核去存储器中调取相应的程序单元。内核可以设置一个或以上,通过调整内核参数来缩短交易的执行时间,增加事务的吞吐量。

存储器可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM),存储器包括至少一个存储芯片。

本发明实施例提供了一种计算机可读存储介质,上述计算机可读存储介质包括存储的程序,其中,在上述程序运行时控制上述计算机可读存储介质所在设备执行上述处理事务的方法。

本发明实施例提供了一种处理器,上述处理器用于运行程序,其中,上述程序运行时执行上述处理事务的方法。

本发明实施例提供了一种电子设备,设备包括处理器、存储器及存储在存储器上并可在处理器上运行的程序,处理器执行程序时实现处理事务的方法步骤。本文中的设备可以是服务器、PC、PAD、手机等。

本申请还提供了一种计算机程序产品,当在数据处理设备上执行时,适于执行初始化有至少如下处理事务的方法步骤的程序:

显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,并且在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。

本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。

本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。

存储器可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。存储器是计算机可读介质的示例。

计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。

还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括要素的过程、方法、商品或者设备中还存在另外的相同要素。

从以上的描述中,可以看出,本申请上述的实施例实现了如下技术效果:

1)、本申请的处理事务的方法,可以使用组合服务组合TC和TM,这样无需再独立部署TC和TM了,可以缩短组合服务和原子服务通信的时间,并且在目标原子服务处理目标事务前就将目标原子服务的信息存储到数据库中了,组合服务可以在处理目标事务前确定目标原子服务以及目标原子服务的信息了,无需TC和TM之间的频繁通信,进而可以缩短交易的执行时间,提高了事务的吞吐量。

2)、本申请的处理事务的装置,可以使用组合服务组合TC和TM,这样无需再独立部署TC和TM了,可以缩短组合服务和原子服务通信的时间,并且在目标原子服务处理目标事务前就将目标原子服务的信息存储到数据库中了,组合服务可以在处理目标事务前确定目标原子服务以及目标原子服务的信息了,无需TC和TM之间的频繁通信,进而可以缩短交易的执行时间,提高了事务的吞吐量。

以上所述仅为本申请的优选实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号