具体实施方式
为使本说明书的目的、技术方案和优点更加清楚,下面将结合本说明书具 体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描 述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于说明书中的 实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他 实施例,都属于本申请保护的范围。
以下结合附图,详细说明本申请各实施例提供的技术方案。
图1为说明书实施例提供的一种记账的过程,具体可包括以下步骤:
S100:针对接收到的每个记账请求,确定该记账请求针对的账户。
在本说明书一个或多个实施例中,可由记账系统接受记账请求,并执行后 续步骤的操作。其中,该记账系统可以包括:用于执行记账操作的服务器,以 及存储有账户信息以及记账明细等与记账相关的数据的数据库。当然,该记账 系统具体的形式可根据需要配置,例如,该数据库可以是分布式数据库,该服 务器也可以是分布式服务器,本说明书对此不做限定。
为方便描述,后续本说明书以记账系统为执行该记账过程的执行主体进行 说明。于是,在本说明书中该记账系统可接收记账请求。其中,由于记账是对 经济活动的记录,是根据业务执行时的记账需要而生成的,因此记账系统通常 也是接收执行业务的系统发送的记账请求的。当然,对于该记账请求具体是如 何生成的本说明书不做限定。
而由于一个事务在执行过程中,可能需要生成多个记账请求,因此不同的 记账请求可能对应于同一个事务。例如,用户A向用户B转账100元,则执 行业务的系统可分别生成从用户A的账户中扣除100元,以及将用户B的账 户添加100元的两个记账请求。则上述两个记账请求时对应于同一个转账事务。 而为了表明记账请求对应的事务,通常在生成记账请求时,会将记账请求对应 的事务的标识携带在记账请求中(例如,记账请求中可携带有流水号、业务标 识等等)。
另外,本说明书提供的记账过程,主要用于解决现有技术在高并发记账请 求的场景下存在的问题,因此本说明书也已高并发记账请求的场景为例进行后 续的说明。因此该记账系统可以接收到若干记账请求,并且可针对接收到的每 个记账请求,确定该记账请求针对的账户。
具体的,由于在高并发场景下,记账系统在同一时间可以接收到复数的记 账请求,而该记账请求可能是针对不完全相同的账户的记账请求,并且也可能 是在执行不完全相同的事务时生成的,因此记账系统可先确定接收到的每个记 账请求分别针对的账户,以便确定后续步骤的操作。
例如,假设记账系统在某一时刻接收到了如表2所示的记账请求。
表2
该记账系统在同一时间接收到的各记账请求可以对应不完全相同的账户 以及不完全相同的事务的。于是,记账系统可针对每个记账请求,确定该记账 请求针对的账户,以便后续步骤的操作。
S102:当与该记账请求属于同一事务的其他记账请求中,存在针对所述账 户且待处理的记账请求时,根据该记账请求以及所述待处理的记账请求,判断 是否需要扣除所述账户的余额,若是,则获取所述账户的资源锁,进行记账操 作,若否,则在不能获取所述账户的资源锁时,将该记账请求作为待处理的记 账请求进行存储。
在本说明书中,由于步骤S100中针对接收到的每个记账请求,都确定了 该记账请求针对的账户,因此在步骤S102中,仍然基于该记账请求进行说明。
另外,在本说明书中,根据记账请求的内容的不同,可将记账请求对应的 记账操作划分为4种类型的操作,即,冻结操作、解冻操作、流出操作以及流 入操作。
而现有技术中记账请求对应的记账操作需要同步执行的原因是:若不同步 进行记账,可能导致事务执行结果出现扣除金额的数值大于账户中余额的数值 情况出现,可能导致事务执行出现错误或者异常。
于是,在本说明书中,为了避免这一情况的出现,可以根据记账请求对应 的操作类型以及对应的内容,判断是否需要扣除账户的余额,若是,则采用标 准的记账方式进行记账操作,若否,则在无法获取账户的资源锁时,将该记账 请求作为待处理的记账请求进行存储,并在该记账请求所属的事务结束之前, 进行相应的记账操作。也就是异步的进行记账操作,从解决的高并发场景下记 账请求对应的记账操作不执行完毕,事务不会继续执行而导致各类问题(如, 事务等待时间较长,影响效率,或者事务超时导致事务执行失败等等问题)。
具体的,由于对应不同事务的记账请求不能一起结算,而针对不同账户的 记账请求也不能一起结算,因此记账系统可根据步骤S100中确定的记账请求, 判断是否存在与该记账请求属于同一事务,且与该记账请求针对的是同一账户 的待处理的记账请求。若是,则执行步骤S102否则执行步骤S104。
在本说明书步骤S102中,针对存在属于同一事务,且与该记账请求针对 的是同一账户的待处理的记账请求情况进行说明。记账系统首先,可以确定该 记账请求的记账明细并存储,并确定待处理的记账请求的记账明细,其中,记 账明细中包括记账操作的类型以及记账操作的金额。之后,根据该记账请求的 记账明细,以及待处理的记账请求的记账明细,确定明细总额,最后判断明细 总额的支出是否大于收入。
若是,则需要扣除账户的余额,说明若异步进行记账操作,可能导致账户 余额出现错误,因此记账系统可根据该记账请求以及待处理的记账请求,获取 该账户的资源锁,以进行记账操作。当然,若是无法获取该账户的资源锁,则 可与标准记账过程一致,排队等待获取锁。
若否,则说明当前该事务中对于该账户的各记账请求无需扣除账户余额, 若异步进行记账操作也不回导致账户余额出现错误,因此记账系统可在不能获 取该账户的资源锁时,将该记账请求作为待处理的记账请求进行存储。当然, 若是记账系统可获取该账户的资源锁,则可与标准记账过程一致,根据该记账 请求以及待处理的记账请求进行记账操作。
需要说明的是,在本说明书中,记账系统确定出的待处理的记账请求可以 存在多个。例如,假设某一事物在执行过程中,按照时间先后顺序,先后生成 了记账请求1~记账请求3,分别为:账户b余额增加100元,账户b余额增加 50元以及账户b余额支出10元。可见上述3条记账请求的明细总额为:账户 b余额增加140元。如表3所示。
记账请求 |
针对的账户 |
对应的事务 |
记账明细 |
明细总额 |
记账请求1 |
账户b |
事务002 |
流入操作,100元 |
增加100元 |
记账请求2 |
账户b |
事务002 |
流入操作,50元 |
增加150元 |
记账请求3 |
账户b |
事务002 |
支出操作,10元 |
增加140元 |
表3
表2中每行记账请求对应的明细总额,为当前该账户b在事务002中,待 处理的记账请求确定出的明细总额。因此,当记账系统接收到上述记账请求1~3 时,若都无法获取账户b的资源锁,可依次将上述3条记账请求分别作为待处 理的记账请求进行存储。
进一步假设,该事务在执行过程中,又生成了一个记账请求4为:账户b 余额增加50元,则记账系统可进一步确定明细总额的支出不大于收入,因此 在无法获取账户b的资源锁时,还可将该记账请求作为待处理的记账请求存储。
假设,在该事务执行过程,生成的记账请求4为:账户b余额扣除200元, 则记账系统可确定明细总额的支出大于收入,则此时,记账系统需要获取账户 b的资源锁,并将进行记账操作。
可见,在本说明书中,只要对应同一事务,且针对同一账户的若干记账请 求的明细总额的支出不大于收入,则记账系统在无法获取该账户的资源锁时, 都可以将记账请求作为待存储的记账请求存储。是该事务的执行可以继续进行, 而不会应为排队等待资源锁而导致事务执行的效率下降。同时,也可减少排队 等待获取资源锁的线程的数量,减少了数据库的运行压力。
S104:当与该记账请求属于同一事务的其他记账请求中,不存在针对所述 账户的待处理的记账请求时,根据该记账请求,判断是否需要扣除所述账户的 余额,若是,则获取所述账户的资源锁,进行记账操作,若否,则在不能获取 所述账户的资源锁时,将该记账请求作为待处理的记账请求进行存储。
在本说明书中,基于前述步骤S102中所述的判断步骤,若记账系统可确 定与该记账请求属于同一事务的其他记账请求中,不存在针对该账户的待处理 的记账请求时,记账系统可以根据该记账请求的记账操作的类型,判断是否需 要获取该账户的资源锁。由于,各记账操作的类型中,除了流入操作以外,其 余记账操作都存在从账户余额中支出金额的情况存在,因此记账系统在确定没 有待处理的记账请求是,可以仅根据该记账请求的记账操作类型,判断该记账 操作的类型是否是流入操作以外的其他记账操作,若是,则与步骤S102中描 述一致,记账系统可采用标记账的过程进行记账操作,若否,则记账系统可以 在不能获取到该账户的资源锁时,将该记账请求作为待处理的记账请求进行存 储。
基于图1所示的记账过程,记账系统在接收到记账请求时,可根据该记账 请求对应的记账明细,来判断是否在不能获取到账户的资源锁时,异步进行记 账操作。或者,当存在与该记账请求同属一个事务,且针对同一账户的待处理 的记账请求时,根据该记账请求以及待处理的记账请求的明细总额,判断是否 可以进行异步记账操作。使得无需预先对账户是否可进行异步记账操作进行配 置,在减少人工配置带来的成本以外,也避免了现有缓冲记账导致的账户风险。 并且,对于流入操作占多数的账户来说,可以减少获取账户的资源锁的次数, 减轻了数据库的运行压力。解决了现有各种记账技术在面对高并发的记账请求 场景时存在的问题。
另外,在本说明书中,当记账系统将记账请求作为待处理的记账请求进行 存储之后,由于该记账请求对应的记账操作未执行,所以在该记账请所属的事 务结束之前,记账系统可再次进行判断。判断是否仍存储有属于该事务的,针 对该账户的待处理的记账请求,若是,则获取该账户的资源锁,并根据已存储 的若干针对所述账户的待处理的记账请求,进行记账操作,并在记账操作执行 完毕后确定该事务结束。若否,则可直接确定该事务结束。
基于图1所示的记账流程以及上述对记账流程的描述,本说明书对应提供 一种记账的详细流程图,如图2所示。
S200:针对接收到的每个记账请求,确定该记账请求针对的账户。
S202:判断是否存在与该记账请求属于同一事务,且针对同一账户的已存 储的待处理的记账请求,若是,执行步骤S204,若否执行步骤S206;
S204:根据该记账请求,以及确定出的待处理的记账请求,判断是否需要 扣除所述账户的余额,若是则执行步骤S208,若否,则执行步骤S210;
S206:根据该记账请求,判断是否需要扣除所述账户的余额,若是则执行 步骤S212,若否,则执行步骤S210;
S208:获取所述账户的资源锁,根据该记账请求,以及确定出的待处理的 记账请求进行记账操作;
S210:在不能获取所述账户的资源锁时,将该记账请求作为待处理的记账 请求进行存储。
S212:获取所述账户的资源锁,根据该记账请求进行记账操作。
进一步地,步骤S210具体还可包括:
S2100:判断是否获取到了所述账户的资源锁,若是执行步骤S2102,若 否,则执行步骤S2104;
S2102:进行记账操作;
S2104:将该记账请求作为待处理的记账请求进行存储。如图3所示。
需要说明的是,本说明书实施例所提供方法的各步骤的执行主体均可以是 同一设备,或者,该方法也由不同设备作为执行主体。比如,步骤S100和步 骤S102的执行主体可以为设备1,步骤S102的执行主体可以为设备2;或者, 步骤S100的执行主体可以为设备1,步骤S102和步骤S104的执行主体可以 为设备2;等等。上述对本说明书特定实施例进行了描述。其它实施例在所附 权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以 按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附 图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结 果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
基于图1所示的记账的方法,本说明书实施例还提供一种记账的装置,如 图4所示。
图4为本说明书实施例提供的一种记账的装置的结构示意图,所述装置包 括:
请求确定模块300,针对接收到的每个记账请求,确定该记账请求针对的 账户;
记账以及存储模块302,当与该记账请求属于同一事务的其他记账请求中, 存在针对所述账户的待处理的记账请求时,根据该记账请求以及所述待处理的 记账请求,判断是否需要扣除所述账户的余额,若是,则获取所述账户的资源 锁,进行记账操作,若否,则在不能获取所述账户的资源锁时,将该记账请求 作为待处理的记账请求进行存储;
所述记账以及存储模块302,当与该记账请求属于同一事务的其他记账请 求中,不存在针对所述账户的待处理的记账请求时,根据该记账请求,判断是 否需要扣除所述账户的余额,若是,则获取所述账户的资源锁,进行记账操作, 若否,则在不能获取所述账户的资源锁时,将该记账请求作为待处理的记账请 求进行存储。
所述记账以及存储模块302,判断是否需要扣除所述账户的余额之前,根 据该记账请求,确定记账明细并存储,其中所述记账明细中包括对所述账户进 行记账操作的金额。
所述记账以及存储模块302,根据存储的所述待处理的记账请求的记账明 细,以及该记账请求的记账明细,确定该记账请求以及所述待处理的记账请求 的明细总额,判断所述明细总额的支出是否大于收入。
所述记账请求对应的记账操作的操作类型包括:冻结、解冻、流出以及流 入中的一种。
所述记账以及存储模块302,确定该记账请求的操作类型,判断所述操作 类型是否是流入操作类型以外的其他操作类型。
当与该记账请求属于同一事务的其他记账请求中,存在针对所述账户的待 处理的记账请求时,所述记账以及存储模块302,获取所述账户的资源锁,并 根据该记账请求以及所述未处理的记账请求,对所述账户进行记账操作。
当与该记账请求属于同一事务的其他记账请求中,不存在针对所述账户的 待处理的记账请求时,所述记账以及存储模块302,获取所述账户的资源锁, 并根据该记账请求对所述账户进行记账操作。
所述记账以及存储模块302,当判断不需要扣除所述账户的余额,且获取 到了所述账户的资源锁时,则根据该记账请求进行记账操作,或根据该记账请 求以及所述待处理的记账请求进行记账操作。
所述装置还包括:
补账模块304,当所述事务结束之前,判断是否仍存储有针对所述账户的 待处理的记账请求,若是,则获取所述账户的资源锁,并在根据已存储的若干 针对所述账户的待处理的记账请求,进行记账操作之后,确定所述事务结束, 若否,则确定所述事务结束。
基于图1所述的记账的方法,本说明书对应提供一种服务器,如图5所示, 其中,所述服务器包括:一个或多个处理器及存储器,存储器存储有程序,并 且被配置成由一个或多个处理器执行以下步骤:
针对接收到的每个记账请求,确定该记账请求针对的账户;
当与该记账请求属于同一事务的其他记账请求中,存在针对所述账户的待 处理的记账请求时,根据该记账请求以及所述待处理的记账请求,判断是否需 要扣除所述账户的余额,若是,则获取所述账户的资源锁,进行记账操作,若 否,则在不能获取所述账户的资源锁时,将该记账请求作为待处理的记账请求 进行存储;
当与该记账请求属于同一事务的其他记账请求中,不存在针对所述账户的 待处理的记账请求时,根据该记账请求,判断是否需要扣除所述账户的余额, 若是,则获取所述账户的资源锁,进行记账操作,若否,则在不能获取所述账 户的资源锁时,将该记账请求作为待处理的记账请求进行存储。
在20世纪90年代,对于一个技术的改进可以很明显地区分是硬件上的改 进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对 于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已 经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程 编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的 改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(Programmable Logic Device,PLD)(例如现场可编程门阵列(Field ProgrammableGate Array, FPGA))就是这样一种集成电路,其逻辑功能由用户对器件编程来确定。由设计人员自行编程来把一个数字系统“集成”在一片PLD上,而不需要请芯片制造 厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电 路芯片,这种编程也多半改用“逻辑编译器(logic compiler)”软件来实现,它 与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用 特定的编程语言来撰写,此称之为硬件描述语言(Hardware Description Language,HDL),而HDL也并非仅有一种,而是有许多种,如ABEL(Advanced Boolean Expression Language)、AHDL(Altera Hardware DescriptionLanguage)、 Confluence、CUPL(Cornell University Programming Language)、HDCal、JHDL (Java Hardware Description Language)、Lava、Lola、MyHDL、PALASM、RHDL (RubyHardware Description Language)等,目前最普遍使用的是VHDL (Very-High-SpeedIntegrated Circuit Hardware Description Language)与Verilog。 本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作 逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件 电路。
控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器 或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件 或固件)的计算机可读介质、逻辑门、开关、专用集成电路(Application Specific Integrated Circuit,ASIC)、可编程逻辑控制器和嵌入微控制器的形式,控制器 的例子包括但不限于以下微控制器:ARC 625D、Atmel AT91SAM、Microchip PIC18F26K20以及Silicone Labs C8051F320,存储器控制器还可以被实现为存 储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序 代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制 器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包 括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以 将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件 部件内的结构。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实 体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。 具体的,计算机例如可以为个人计算机、膝上型计算机、蜂窝电话、相机电话、 智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制 台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然, 在实施本申请时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计 算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结 合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包 含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、 CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产 品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和 /或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/ 或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入 式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算 机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一 个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设 备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中 的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个 流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使 得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处 理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个 流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出 接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器 (RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内 存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任 何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序 的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、 静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机 存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、 快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光 盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备 或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中 的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排 他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括 那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、 方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括 一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设 备中还存在另外的相同要素。
本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程 序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和 硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算 机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、 光学存储器等)上实施的计算机程序产品的形式。
本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例 如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的 例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本 申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来 执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地 和远程计算机存储介质中。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相 似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。 尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较 简单,相关之处参见方法实施例的部分说明即可。
以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技 术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所 作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。