一种基于分布式锁的开票方法和系统技术方案

技术编号:34741686 阅读:17 留言:0更新日期:2022-08-31 18:34
本发明专利技术公开了一种基于分布式锁的开票方法和系统,所述方法包括:连接在线票据接口,获取开票完毕的票据,根据所述开票完毕票据获取待开票金额数据;获取所述待开票金额数据对应的票据唯一编码;在查询所述待开票金额数据前添加锁逻辑;添加锁逻辑成功后执行已开票金额的减扣操作;完整所述已开票金额的减扣操作后,将减扣完毕的金额数据更新到数据库,并执行解锁操作。行解锁操作。行解锁操作。

【技术实现步骤摘要】
一种基于分布式锁的开票方法和系统


[0001]本专利技术涉及互联网票据
,特别涉及一种基于分布式锁的开票方法和系统。

技术介绍

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

技术实现思路

[0003]本专利技术其中一个专利技术目的在于提供一种基于分布式锁的开票方法和系统,所述方法和系统通过添加分布式锁的方式,将同一开票数据的流程进行原子化处理,使得同一开票流程从并行改为串行,从而避免同一开票数据减扣不同步的问题。
[0004]本专利技术另一个专利技术目的在于提供一种基于分布式锁的开票方法和系统,所述方法和系统在轮询取锁的过程中,通过添加线程暂停时间间隔,从而可以降低获取锁的CPU性能暂用,从而可以适配于大批量的开票金额减扣操作。
[0005]本专利技术另一个专利技术目的在于提供一种基于分布式锁的开票方法和系统,所述方法和系统利用分布式排他锁进行开票金额减扣的原子化处理,当锁被其他线程占用时,返回错误信息,可避免同一个开票金额被不同线程操作,保障开票金额的处理的唯一性和同步性。
[0006]为了实现至少一个上述专利技术目的,本专利技术进一步提供一种基于分布式锁的开票方法,所述方法包括:
[0007]连接在线票据接口,获取开票完毕的票据,根据所述开票完毕票据获取待开票金额数据;
[0008]获取所述待开票金额数据对应的票据唯一编码;
[0009]在查询所述待开票金额数据前添加锁逻辑;
[0010]添加锁逻辑成功后执行已开票金额的减扣操作;
[0011]完整所述已开票金额的减扣操作后,将减扣完毕的金额数据更新到数据库,并执行解锁操作。
[0012]根据本专利技术其中一个较佳实施例,在获取所述票据唯一编码后,将所述票据唯一
编码拼接在票据锁逻辑名称前缀后作为锁逻辑键名,并对所述票据添加锁逻辑。
[0013]根据本专利技术另一个较佳实施例,所述添加锁逻辑方法包括:先判断当前缓存中是否存在锁逻辑对应的键名,若不存在则在添加锁逻辑后将生成的具有票据唯一编码信息的键名保存在缓存中,保存成功后生成锁逻辑添加成功标记。
[0014]根据本专利技术另一个较佳实施例,所述添加锁逻辑方法还包括:若先判断当前缓存中不存在锁逻辑对应的键名,则返回错误信息。
[0015]根据本专利技术另一个较佳实施例,所述锁逻辑采用排他锁,查询当前其他线程是否存在当前锁逻辑对应的键名,若存在则返回错误信息;若不存在,则当前线程持有当前锁逻辑对应的键名。
[0016]根据本专利技术另一个较佳实施例,在完成票据金额减扣操作并更新数据库后,执行解锁逻辑,所述解锁逻辑方法包括:查找当前锁逻辑在缓存中保存的具有票据唯一编码的键名,并将该键名擦除后完成解锁逻辑。
[0017]根据本专利技术另一个较佳实施例,所述锁逻辑的方法包括:利用tryLock方法预设获取锁逻辑时间间隔,通过所述tryLock尝试获取锁逻辑对应键名,若不存在,则在预设的获取时间间隔后再次查询,若存在,则将锁逻辑生成的具有对应票据唯一编码的键名保存于缓存中。
[0018]根据本专利技术另一个较佳实施例,所述缓存为redies缓存,所述锁逻辑对应的键名保存于所述redies缓存作为锁添加成功标志,擦除所述redies缓存中锁逻辑对应的键名,则释放对应的锁逻辑。
[0019]为了实现至少一个上述专利技术目的,本专利技术进一步提供一种基于分布式锁的开票开系统,所述系统执行上述一种基于分布式锁的开票方法。
[0020]本专利技术进一步提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序可被处理器执行所述一种基于分布式锁的开票方法。
附图说明
[0021]图1显示的是本专利技术中一种基于分布式锁的方法流程示意图。
具体实施方式
[0022]以下描述用于揭露本专利技术以使本领域技术人员能够实现本专利技术。以下描述中的优选实施例只作为举例,本领域技术人员可以想到其他显而易见的变型。在以下描述中界定的本专利技术的基本原理可以应用于其他实施方案、变形方案、改进方案、等同方案以及没有背离本专利技术的精神和范围的其他技术方案。
[0023]可以理解的是,术语“一”应理解为“至少一”或“一个或多个”,即在一个实施例中,一个元件的数量可以为一个,而在另外的实施例中,该元件的数量可以为多个,术语“一”不能理解为对数量的限制。
[0024]请结合图1,本专利技术公开了一种基于分布式锁的开票方法和系统,其中所述方法包括:首先用户需要调用在线开票接口,通过所述在线开票接口实现票据的开票操作,在完成所述开票操作后,系统生成待开票金额数据,需要说明的是,所述待开票金额数据为后台数据库中存储的对应发票金额信息。本专利技术对所述待开票金额数据进行分布式加锁操作,在
完成加锁后进一步对已经加锁的待开票金额对应的票据进行查询,若查询到对应已开票票据后执行对应账户的已待开票金额数据的减扣操作,已开票票据可以根据票据自身记载的唯一编码等身份信息查询到数据库中对应待开票金额数据执行金额减扣操作。
[0025]值得一提的是,在通过线上开票接口批量对票据完成开票操作后,进一步获取待开票金额数据的唯一编码(invoice Draft Code),其中所述待开票金额数据唯一编码为对应票据自身的唯一编码。进一步将所述待开票金额数据的唯一编码拼接在票据锁逻辑名称(lock_operateInvoiceDraftAndApplication_)前缀之后,将拼接好的信息作为所述锁逻辑的键名(key),并将所述键值存储于缓存中,其中本专利技术优选Redis缓存。需要说明的是,本专利技术设计锁逻辑的添加操作,使得票据可以串行地执行待开票票据的添加操作。
[0026]其中所述锁逻辑添加操作包括:在查询当前待开票金额数据之前,需要从所述Redis缓存中查询当前已经开票票据是否存在对应的锁逻辑键名(key),若存在锁逻辑健名,等待固定时间后继续查询下一个票据的待开票金额。若查询到当前已经开票的票据在Redis缓存中不存在对应的键名,则生成包含对应开票票据唯一编码键名,并将生成的键名存储于所述Redis缓存中,并对所述对应的待开票金额执行加锁操作,在加锁后,所述对应的待开票金额将会等待预设的固定时间,等待预设的固定时间后执行对应待开本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于分布式锁的开票方法,其特征在于,所述方法包括:连接在线票据接口,获取开票完毕的票据,根据所述开票完毕票据获取待开票金额数据;获取所述待开票金额数据对应的票据唯一编码;在查询所述待开票金额数据前添加锁逻辑;添加锁逻辑成功后执行已开票金额的减扣操作;完整所述已开票金额的减扣操作后,将减扣完毕的金额数据更新到数据库,并执行解锁操作。2.根据权利要求1所述的一种基于分布式锁的开票方法,其特征在于,在获取所述票据唯一编码后,将所述票据唯一编码拼接在票据锁逻辑名称前缀后作为锁逻辑键名,并对所述票据添加锁逻辑。3.根据权利要求2所述的一种基于分布式锁的开票方法,其特征在于,所述添加锁逻辑方法包括:先判断当前缓存中是否存在锁逻辑对应的键名,若不存在则在添加锁逻辑后将生成的具有票据唯一编码信息的键名保存在缓存中,保存成功后生成锁逻辑添加成功标记。4.根据权利要求2所述的一种基于分布式锁的开票方法,其特征在于,所述添加锁逻辑方法还包括:若先判断当前缓存中不存在锁逻辑对应的键名,则返回错误信息。5.根据权利要求2所述的一种基于分布式锁的开票方法,其特征在于,所述锁逻辑采用排他锁,查询当前其他线程是否存在当前锁逻辑对应的键名,若存在则返回错误信息;若不存在,则当前线程持有当前锁逻辑对...

【专利技术属性】
技术研发人员:何建东叶少宁李翔魏美钟
申请(专利权)人:杭州每刻科技有限公司
类型:发明
国别省市:

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

1