一种基于分布式锁的开票方法和系统与流程

文档序号:31340489发布日期:2022-08-31 10:01阅读:132来源:国知局
一种基于分布式锁的开票方法和系统与流程

1.本发明涉及互联网票据技术领域,特别涉及一种基于分布式锁的开票方法和系统。


背景技术:

2.目前客户通过前端系统接口或openapi接口调用发票在线开具功能,系统会根据调用参数完成发票的在线开具任务。发票成功开具后,系统会通过查询数据库中的待开票的金额信息,将其与开具成功的发票金额进行对比,并在对比后进行相应扣减,最后将扣减信息更新数据库。若待开票金额扣减至零,则还会同步更新待开票信息的状态为完成开票状态。当用户调用开票接口的批量开票功能时,由同时开具多张发票引起的并发开票流程,会导致系统在完成第一张发票的待开票金额扣减后数据更新前去为第二张完成开具的查询待开票金额(从查询到更新平均用时100ms,前后查询间隔平均用时60ms),此时获取的待开票金额是不正确的,因为该待开票金额尚未扣减第一张发票的金额。即现有方案会在批量开票时出现并发系统常见的数据不同步问题。


技术实现要素:

3.本发明其中一个发明目的在于提供一种基于分布式锁的开票方法和系统,所述方法和系统通过添加分布式锁的方式,将同一开票数据的流程进行原子化处理,使得同一开票流程从并行改为串行,从而避免同一开票数据减扣不同步的问题。
4.本发明另一个发明目的在于提供一种基于分布式锁的开票方法和系统,所述方法和系统在轮询取锁的过程中,通过添加线程暂停时间间隔,从而可以降低获取锁的cpu性能暂用,从而可以适配于大批量的开票金额减扣操作。
5.本发明另一个发明目的在于提供一种基于分布式锁的开票方法和系统,所述方法和系统利用分布式排他锁进行开票金额减扣的原子化处理,当锁被其他线程占用时,返回错误信息,可避免同一个开票金额被不同线程操作,保障开票金额的处理的唯一性和同步性。
6.为了实现至少一个上述发明目的,本发明进一步提供一种基于分布式锁的开票方法,所述方法包括:
7.连接在线票据接口,获取开票完毕的票据,根据所述开票完毕票据获取待开票金额数据;
8.获取所述待开票金额数据对应的票据唯一编码;
9.在查询所述待开票金额数据前添加锁逻辑;
10.添加锁逻辑成功后执行已开票金额的减扣操作;
11.完整所述已开票金额的减扣操作后,将减扣完毕的金额数据更新到数据库,并执行解锁操作。
12.根据本发明其中一个较佳实施例,在获取所述票据唯一编码后,将所述票据唯一
编码拼接在票据锁逻辑名称前缀后作为锁逻辑键名,并对所述票据添加锁逻辑。
13.根据本发明另一个较佳实施例,所述添加锁逻辑方法包括:先判断当前缓存中是否存在锁逻辑对应的键名,若不存在则在添加锁逻辑后将生成的具有票据唯一编码信息的键名保存在缓存中,保存成功后生成锁逻辑添加成功标记。
14.根据本发明另一个较佳实施例,所述添加锁逻辑方法还包括:若先判断当前缓存中不存在锁逻辑对应的键名,则返回错误信息。
15.根据本发明另一个较佳实施例,所述锁逻辑采用排他锁,查询当前其他线程是否存在当前锁逻辑对应的键名,若存在则返回错误信息;若不存在,则当前线程持有当前锁逻辑对应的键名。
16.根据本发明另一个较佳实施例,在完成票据金额减扣操作并更新数据库后,执行解锁逻辑,所述解锁逻辑方法包括:查找当前锁逻辑在缓存中保存的具有票据唯一编码的键名,并将该键名擦除后完成解锁逻辑。
17.根据本发明另一个较佳实施例,所述锁逻辑的方法包括:利用trylock方法预设获取锁逻辑时间间隔,通过所述trylock尝试获取锁逻辑对应键名,若不存在,则在预设的获取时间间隔后再次查询,若存在,则将锁逻辑生成的具有对应票据唯一编码的键名保存于缓存中。
18.根据本发明另一个较佳实施例,所述缓存为redies缓存,所述锁逻辑对应的键名保存于所述redies缓存作为锁添加成功标志,擦除所述redies缓存中锁逻辑对应的键名,则释放对应的锁逻辑。
19.为了实现至少一个上述发明目的,本发明进一步提供一种基于分布式锁的开票开系统,所述系统执行上述一种基于分布式锁的开票方法。
20.本发明进一步提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序可被处理器执行所述一种基于分布式锁的开票方法。
附图说明
21.图1显示的是本发明中一种基于分布式锁的方法流程示意图。
具体实施方式
22.以下描述用于揭露本发明以使本领域技术人员能够实现本发明。以下描述中的优选实施例只作为举例,本领域技术人员可以想到其他显而易见的变型。在以下描述中界定的本发明的基本原理可以应用于其他实施方案、变形方案、改进方案、等同方案以及没有背离本发明的精神和范围的其他技术方案。
23.可以理解的是,术语“一”应理解为“至少一”或“一个或多个”,即在一个实施例中,一个元件的数量可以为一个,而在另外的实施例中,该元件的数量可以为多个,术语“一”不能理解为对数量的限制。
24.请结合图1,本发明公开了一种基于分布式锁的开票方法和系统,其中所述方法包括:首先用户需要调用在线开票接口,通过所述在线开票接口实现票据的开票操作,在完成所述开票操作后,系统生成待开票金额数据,需要说明的是,所述待开票金额数据为后台数据库中存储的对应发票金额信息。本发明对所述待开票金额数据进行分布式加锁操作,在
完成加锁后进一步对已经加锁的待开票金额对应的票据进行查询,若查询到对应已开票票据后执行对应账户的已待开票金额数据的减扣操作,已开票票据可以根据票据自身记载的唯一编码等身份信息查询到数据库中对应待开票金额数据执行金额减扣操作。
25.值得一提的是,在通过线上开票接口批量对票据完成开票操作后,进一步获取待开票金额数据的唯一编码(invoice draft code),其中所述待开票金额数据唯一编码为对应票据自身的唯一编码。进一步将所述待开票金额数据的唯一编码拼接在票据锁逻辑名称(lock_operateinvoicedraftandapplication_)前缀之后,将拼接好的信息作为所述锁逻辑的键名(key),并将所述键值存储于缓存中,其中本发明优选redis缓存。需要说明的是,本发明设计锁逻辑的添加操作,使得票据可以串行地执行待开票票据的添加操作。
26.其中所述锁逻辑添加操作包括:在查询当前待开票金额数据之前,需要从所述redis缓存中查询当前已经开票票据是否存在对应的锁逻辑键名(key),若存在锁逻辑健名,等待固定时间后继续查询下一个票据的待开票金额。若查询到当前已经开票的票据在redis缓存中不存在对应的键名,则生成包含对应开票票据唯一编码键名,并将生成的键名存储于所述redis缓存中,并对所述对应的待开票金额执行加锁操作,在加锁后,所述对应的待开票金额将会等待预设的固定时间,等待预设的固定时间后执行对应待开票金额的减扣操作。其中所述固定时间可以被设置为100ms-300ms。
27.需要说明的是,本发明中,所述不同票据的待开票金额可以有不同的线程处理,本发明核心优势在于提供排他锁的轮询取锁操作,判断当前其他线程是否存在对应票据锁逻辑键名,若存在,则直接返回错误信息;若当前线程查询到redis缓存中存在对应的锁逻辑键名,则取回锁逻辑键名后返回正确信息。也就是说,通过排他锁判断其他线程是否持有对应的票据锁逻辑而分别执行不同的返回信息,其中本发明通过trylock指令可以执行上述排他锁的轮询取锁操作,上述针对不同票据的排他锁的轮询取锁操作,可以有效地避免并发票据开票过程中出现的减扣数据不同步的问题,使得原先并行减扣操作转化为串行减扣,保障了数据的同步性。
28.在通过所述trylock指令获取到对应的锁逻辑后,进一步执行已经开票的票据对应的待开票金额的减扣操作,在完成所述待开票金额的减扣操作后,执行所述锁逻辑的解锁操作。其中所述锁逻辑的解锁操作包括:在完成对应已开票票据对应的待开票金额数据的减扣操作并在数据库中更新后,获取当前当前完成待开票金额数据减扣操作对应的票据唯一编码,根据所述票据唯一编码从所述redis缓存中查找到对应的锁逻辑键名,进一步擦除对应票据的锁逻辑键名,从而释放对应的锁逻辑。
29.当所述锁逻辑释放后,相同唯一编码票据可以执行下一次的排他锁轮训取锁操作,执行下一次的排他锁的取锁后执行下一次对应待开票金额的减扣操作。因此使得不同批次的待开票金额减扣操作不会出现前后不一致的现象,保证了每次待开票金额减扣操作和对应开票票据记载金额相同。
30.本发明在锁逻辑中添加了线程暂停时间间隔,即当前线程查询到存在对应的锁逻辑键名,则等待预设的固定时间后进一步执行下一个票据轮训取锁操作。
31.特别地,根据本发明公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样
的实施例中,该计算机程序可以通过通信部分从网络上被下载和安装,和/或从可拆卸介质被安装。在该计算机程序被中央处理单元(cpu)执行时,执行本技术的方法中限定的上述功能。需要说明的是,本技术上述的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是但不限于电、磁、光、电磁、红外线段、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线段的电连接、便携式计算机磁盘、硬盘、随机访问存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、光纤、便携式紧凑磁盘只读存储器(cd-rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本技术中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本技术中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线段、电线段、光缆、rf等等,或者上述的任意合适的组合。
32.附图中的流程图和框图,图示了按照本发明各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,该模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
33.本领域的技术人员应理解,上述描述及附图中所示的本发明的实施例只作为举例而并不限制本发明,本发明的目的已经完整并有效地实现,本发明的功能及结构原理已在实施例中展示和说明,在没有背离所述原理下,本发明的实施方式可以有任何变形或修改。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1