基于数据库的分布式锁处理方法、装置、存储介质及系统

阅读: 评论:0

著录项
  • CN202210294664.8
  • 20220322
  • CN114647655A
  • 20220621
  • 康键信息技术(深圳)有限公司
  • 李斌
  • G06F16/23
  • G06F16/23

  • 广东省深圳市前海深港合作区前湾一路1号A栋201室(入驻深圳市前海商务秘书有限公司)
  • 广东(44)
  • 上海汉之律师事务所
  • 周婷婷
摘要
本发明涉及计算机技术领域,提供一种基于数据库的分布式锁处理方法、装置、存储介质及系统,处理方法包括:获取内存锁,以确定持有所述内存锁的进程;当所述进程未持有分布式锁时,生成申请分布式锁的标志,并确定分布式锁的标识;基于所述申请分布式锁的标志和所述分布式锁的标识,发送取锁请求;数据库接收所述取锁请求,并基于所述分布式锁的标识进行空锁检测和锁超时检测,以确定将所述分布式锁分配给所述进程;本发明的基于数据库的分布式锁处理方法及装置能够避免请求锁的服务器在取锁过程中被阻塞;并且在取锁时判断当前锁是否超时,以避免因当前锁所在的服务器突然宕机,长时间无法释放锁,导致其他服务器一直无法获取到锁。
权利要求

1.一种基于数据库的分布式锁处理方法,其特征在于,所述分布式锁处理方法包括以下步骤:

获取内存锁,以确定持有所述内存锁的进程;

当所述进程未持有分布式锁时,生成申请分布式锁的标志,并确定分布式锁的标识;

基于所述申请分布式锁的标志和所述分布式锁的标识,发送取锁请求;

数据库接收所述取锁请求,并基于所述分布式锁的标识进行空锁检测和锁超时检测,以确定将所述分布式锁分配给所述进程。

2.根据权利要求1所述的方法,其特征在于,所述当所述进程未持有分布式锁时,生成申请分布式锁的标志,以确定分布式锁的标识,包括:

当所述进程未持有所述分布式锁时,基于所述进程,生成申请所述分布式锁的标志;

基于所述进程,获取所述进程争用的共享资源;

基于所述共享资源确定分布式锁的标识。

3.根据权利要求2所述的方法,其特征在于,所述基于所述申请分布式锁的标志和所述分布式锁的标识,发送取锁请求,包括:

基于所述分布式锁的标识,在所述数据库中预设的分布式锁的数据表中查询分布式锁的标识对应的字段是否有所述标识;

当所述标识存在时,基于所述申请分布式锁的标志和所述分布式锁的标识,发送所述取锁请求;

当所述标识不存在时,在所述数据库的分布式锁的标识对应的字段中创建所述分布式锁的标识;再基于所述申请分布式锁的标志和所述分布式锁的标识,发送所述取锁请求。

4.根据权利要求3所述的方法,其特征在于,所述数据库接收所述取锁请求,并基于所述分布式锁的标识进行空锁检测和锁超时检测,以确定将所述分布式锁分配给所述进程,包括:

所述数据库中预设的所述分布式锁的数据表的字段包括:第一分布式锁标识、第一持有者标志、第一持有时间点以及第一持有超时时长;

基于所述分布式锁标识查询对应的所述第一持有者标志、所述第一持有时间点以及所述第一持有超时时长的字段是否都为空;

当所述字段都为空时,基于所述进程,更新所述第一持有者标志、所述第一持有时间点以及所述第一持有超时时长的字段对应的内容,以确定将所述分布式锁分配给所述进程;

当所述字段不为空时,查询所述第一持有超时时长的字段对应的数值,判断是否更新所述第一持有者标志、所述第一持有时间点以及所述第一持有超时时长;并基于判断结果处理是否将所述分布式锁分配给所述进程。

5.根据权利要求4所述的方法,其特征在于,所述判断是否更新所述第一持有者标志、所述第一持有时间点以及所述第一持有超时时长;并基于判断结果处理是否将所述分布式锁分配给所述进程,包括:

基于所述数值、所述第一持有时间点对应到的第一时间点以及当前时间,判断第一持有者标志对应的持有者持有所述分布式锁的时间是否超时;

当判断结果为超时时,将所述第一持有者标志、所述第一持有时间点以及所述第一持有超时时长的字段对应的内容都设置为空;

基于所述进程,更新所述第一持有者标志、所述第一持有时间点以及所述第一持有超时时长的字段对应的内容;

当判断结果为未超时时,基于所述第一持有时间点、所述第一持有超时时长以及所述当前时间,在确定对应的持有者持有所述分布式锁的时间为超时时,再基于所述进程,更新所述第一持有者标志、所述第一持有时间点以及所述第一持有超时时长的字段对应的内容。

6.根据权利要求4所述的方法,其特征在于,所述确定持有所述内存锁的进程之后,还包括:

当所述进程持有分布式锁时,基于所述进程、分布式锁的标识,发送释放锁请求;

数据库接收所述释放锁请求,并基于所述分布式锁的标识,将预设的分布式锁的数据表中对应的字段内容更新为空,以确定将所述进程持有的所述分布式锁释放。

7.根据权利要求6所述的方法,其特征在于,所述基于所述分布式锁的标识,将预设的分布式锁的数据表中对应的字段内容更新为空,以确定将所述进程持有的所述分布式锁释放,包括:

当在所述分布式锁的数据表中查询到所述分布式锁的标识后,基于所述分布式锁的标识查询对应的第一持有者标志的字段对应的内容;

将所述第一持有者标志对应的内容和所述释放请求中的进程信息做比较;

当比较结果为匹配一致时,将所述分布式锁的标识对应的所述第一持有者标志、所述第一持有时间点以及所述第一持有超时时长的字段对应的内容都置为空,以确定将所述进程持有的所述分布式锁释放。

8.一种基于数据库的分布式锁处理装置,其特征在于,包括:

获取模块,用于获取内存锁,以确定持有所述内存锁的进程;

处理模块,用于当所述进程未持有分布式锁时,生成申请分布式锁的标志,并确定分布式锁的标识;

发送模块,用于基于所述申请分布式锁的标志和所述分布式锁的标识,发送取锁请求;

确定模块,用于数据库接收所述取锁请求,并基于所述分布式锁的标识进行空锁检测和锁超时检测,以确定将所述分布式锁分配给所述进程。

9.一种存储介质,存储有程序指令,其中,所述程序指令被执行时实现如权利要求1至权利要求7任一项所述的基于数据库的分布式锁处理方法的步骤。

10.一种基于数据库的分布式锁处理系统,其特征在于:包括存储器,用于存储计算机程序;处理器,用于运行所述计算机程序以实现如权利要求1至权利要求7任一权利要求所述的基于数据库的分布式锁处理方法的步骤。

说明书
技术领域

本发明涉及计算机技术领域,特别是涉及基于数据库的分布式锁处理方法、装置、存储介质及系统。

目前,不论是单进程程序、多进程程序还是分布式系统,都需要面对一个并发程序处理最常见的问题:共享资源的争用,即如何保证并发场景下对共享资源读写操作的时序性、原子性以及一致性;通常的解决方法是使用“锁”对并发读写数据进行保护。比如,单进程程序中使用内存锁、多进程程序中使用文件锁、以及分布式系统中使用分布式锁等;由于分布式系统的应用普及,因此,对分布式系统中“锁”的使用尤为关注。

现有技术中,在分布式系统中分布式锁的使用是通过数据库来实现的,主要有两种方法,一种是基于数据库的行级锁;一种是通过比较表字段的值来实现的乐观锁;第一种方法会使系统线程被阻塞,这种阻塞状态不会因等待时长超时被取消,而是直到线程获取到锁,阻塞状态才能取消;第二种方法是多个线程先对共享数据进行操作,再在提交时进行冲突检测,这种处理仍会存在脏读的问题,无法有效锁住资源;此外,在获取到锁的服务器宕机未释放锁时,其它服务器无法获取到该锁。

因此,如何有针对性且灵活地进行分布式锁的处理是一个亟待解决的问题。

鉴于以上所述现有技术的缺点,本发明的目的在于提供一种基于数据库的分布式锁处理方法、装置、存储介质及系统,用于解决现有技术中无法正对性且灵活地进行分布式锁的处理的问题。

为实现上述目的及其他相关目的,本发明提供一种基于数据库的分布式锁处理方法,包括以下步骤:获取内存锁,以确定持有所述内存锁的进程;当所述进程未持有分布式锁时,生成申请分布式锁的标志,并确定分布式锁的标识;基于所述申请分布式锁的标志和所述分布式锁的标识,发送取锁请求;数据库接收所述取锁请求,并基于所述分布式锁的标识进行空锁检测和锁超时检测,以确定将所述分布式锁分配给所述进程。

于本发明的一实施例中,所述当所述进程未持有分布式锁时,生成申请分布式锁的标志,以确定分布式锁的标识,包括:当所述进程未持有所述分布式锁时,基于所述进程,生成申请所述分布式锁的标志;基于所述进程,获取所述进程争用的共享资源;基于所述共享资源确定分布式锁的标识。

于本发明的一实施例中,所述基于所述申请分布式锁的标志和所述分布式锁的标识,发送取锁请求,包括:基于所述分布式锁的标识,在所述数据库中预设的分布式锁的数据表中查询分布式锁的标识对应的字段是否有所述标识;当所述标识存在时,基于所述申请分布式锁的标志和所述分布式锁的标识,发送所述取锁请求;当所述标识不存在时,在所述数据库的分布式锁的标识对应的字段中创建所述分布式锁的标识;再基于所述申请分布式锁的标志和所述分布式锁的标识,发送所述取锁请求。

于本发明的一实施例中,所述数据库接收所述取锁请求,并基于所述分布式锁的标识进行空锁检测和锁超时检测,以确定将所述分布式锁分配给所述进程,包括:所述数据库中预设的所述分布式锁的数据表的字段包括:第一分布式锁标识、第一持有者标志、第一持有时间点以及第一持有超时时长;基于所述分布式锁标识查询对应的所述第一持有者标志、所述第一持有时间点以及所述第一持有超时时长的字段是否都为空;当所述字段都为空时,基于所述进程,更新所述第一持有者标志、所述第一持有时间点以及所述第一持有超时时长的字段对应的内容,以确定将所述分布式锁分配给所述进程;当所述字段不为空时,查询所述第一持有超时时长的字段对应的数值,判断是否更新所述第一持有者标志、所述第一持有时间点以及所述第一持有超时时长;并基于判断结果处理是否将所述分布式锁分配给所述进程。

于本发明的一实施例中,所述判断是否更新所述第一持有者标志、所述第一持有时间点以及所述第一持有超时时长;并基于判断结果处理是否将所述分布式锁分配给所述进程,包括:基于所述数值、所述第一持有时间点对应到的第一时间点以及当前时间,判断第一持有者标志对应的持有者持有所述分布式锁的时间是否超时;当判断结果为超时时,将所述第一持有者标志、所述第一持有时间点以及所述第一持有超时时长的字段对应的内容都设置为空;基于所述进程,更新所述第一持有者标志、所述第一持有时间点以及所述第一持有超时时长的字段对应的内容;当判断结果为未超时时,基于所述第一持有时间点、所述第一持有超时时长以及所述当前时间,在确定对应的持有者持有所述分布式锁的时间为超时时,再基于所述进程,更新所述第一持有者标志、所述第一持有时间点以及所述第一持有超时时长的字段对应的内容。

于本发明的一实施例中,所述确定持有所述内存锁的进程之后,还包括:当所述进程持有分布式锁时,基于所述进程、分布式锁的标识,发送释放锁请求;数据库接收所述释放锁请求,并基于所述分布式锁的标识,将预设的分布式锁的数据表中对应的字段内容更新为空,以确定将所述进程持有的所述分布式锁释放。

于本发明的一实施例中,所述基于所述分布式锁的标识,将预设的分布式锁的数据表中对应的字段内容更新为空,以确定将所述进程持有的所述分布式锁释放,包括:当在所述分布式锁的数据表中查询到所述分布式锁的标识后,基于所述分布式锁的标识查询对应的第一持有者标志的字段对应的内容;将所述第一持有者标志对应的内容和所述释放请求中的进程信息做比较;当比较结果为匹配一致时,将所述分布式锁的标识对应的所述第一持有者标志、所述第一持有时间点以及所述第一持有超时时长的字段对应的内容都置为空,以确定将所述进程持有的所述分布式锁释放。

对应地,本发明提供一种基于数据库的分布式锁处理装置,包括:获取模块,用于获取内存锁,以确定持有所述内存锁的进程;处理模块,用于当所述进程未持有分布式锁时,生成申请分布式锁的标志,并确定分布式锁的标识;发送模块,用于基于所述申请分布式锁的标志和所述分布式锁的标识,发送取锁请求;确定模块,用于数据库接收所述取锁请求,并基于所述分布式锁的标识进行空锁检测和锁超时检测,以确定将所述分布式锁分配给所述进程。

本发明提供一种存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述的基于数据库的分布式锁处理方法。

本发明提供一基于数据库的分布式锁处理系统,包括存储器,用于存储计算机程序;处理器,用于运行所述计算机程序以实现上述的基于数据库的分布式锁处理方法。

如上所述,本发明的基于数据库的分布式锁处理方法及装置,具有以下有益效果:

(1)能够避免请求锁的服务器在取锁过程中被阻塞;

(2)在取锁时判断当前锁是否超时,以避免因当前锁所在的服务器突然宕机,长时间无法释放锁,导致其他服务器一直无法获取到锁;

(3)当释放锁时,能够基于持有的分布式锁的标识进行准确释放。

图1显示为本发明的基于数据库的分布式锁处理方法于一实施例中的流程图一。

图2显示为本发明的基于数据库的分布式锁处理方法于一实施例中的分配锁实例图。

图3显示为本发明的基于数据库的分布式锁处理方法于一实施例中的释放锁实例图。

图4显示为本发明的基于数据库的分布式锁处理装置于一实施例中的结构示意图。

图5显示为本发明的基于数据库的分布式锁处理装置于一实施例中的分布式锁处理系统图。

元件标号说明

41 获取模块

42 处理模块

43 发送模块

44 确定模块

51 处理器

52 存储器

以下通过特定的具体实例说明本发明的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本发明的其他优点与功效。本发明还可以通过另外不同的具体实施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本发明的精神下进行各种修饰或改变。需说明的是,在不冲突的情况下,以下实施例及实施例中的特征可以相互组合。

需要说明的是,以下实施例中所提供的图示仅以示意方式说明本发明的基本构想,遂图式中仅显示与本发明中有关的组件而非按照实际实施时的组件数目、形状及尺寸绘制,其实际实施时各组件的型态、数量及比例可为一种随意的改变,且其组件布局型态也可能更为复杂。

本发明的基于数据库的分布式锁处理方法及装置,能够避免请求锁的服务器在取锁过程中被阻塞;并且在取锁时判断当前锁是否超时,以避免因当前锁所在的服务器突然宕机,长时间无法释放锁,导致其他服务器一直无法获取到锁;此外当释放锁时,能够基于持有的分布式锁的标识进行准确释放。

如图1所示,于本实施例中,本发明的基于数据库的分布式锁处理方法包括以下步骤:

步骤S1、获取内存锁,以确定持有所述内存锁的进程。

具体地,在分布式系统中,当进程间发生共享资源的争用时,不论争用共享资源的主体是多个服务器的进程还是单个服务器的进程,先基于服务器获取内存锁,以确定持有内存锁的进程。

举例来说,当共享资源争用的场景发生在单个服务器中时,A服务器中多个进程都需要对数据库中的同一数据进行修改操作;先在A服务器中获取内存锁,其中,内存锁对应这里的每个进程。当共享资源争用的场景发生在多个服务器之间时,A、B服务器中都有进程需要对数据库中的同一数据进行更新操作;先分别在A服务器、B服务器中获取内存锁。

步骤S2、当所述进程未持有分布式锁时,生成申请分布式锁的标志,并确定分布式锁的标识。

具体地,对持有内存锁的进程检测是否持有分布式锁,当检测进程持有分布式锁时,申请锁流程结束;当所述进程未持有所述分布式锁时,基于所述进程,生成申请所述分布式锁的标志;基于所述进程,获取所述进程争用的共享资源;基于所述共享资源确定分布式锁的标识。

进一步具体地,在确定出持有内存锁的进程后,从数据库中预设的分布式锁的数据表中查询持有者字段的内容是否为进程对应的标识,若查询到进程对应的标识时,则不再进行后续处理;若未查询到进程对应的标识,则基于该进程生成申请分布式锁的标志,并确定分布式锁的标识。

进一步具体地,在对持有内存锁的进程检测是否持有分布式锁时,若进程之前有分配到分布式锁,则可直接基于进程中的分布式锁信息进行持锁检测,当进程中没有分布式锁信息时再从数据库中的分布式锁的数据表中查询是否有该进程对应的标识。

举例来说,当共享资源争用的场景发生在单个服务器中时,在上述A服务器获取到内存锁后,比如进程1对应内存锁1,进程2对应内存锁2;对进程1、进程2进行是否持有分布式锁的检测,通过上述方法检测出进程1没有持有分布式锁;进程2持有分布式锁;则进程2结束申请锁流程,进程1继续处理,基于进程1生成申请分布式锁的标志。

当共享资源争用的场景发生在多个服务器之间时,在上述A服务器、B服务器分别获取内存锁后,比如A服务器中的进程3对应内存锁3,进程4对应内存锁4;对进程3、进程4进行是否持有分布式锁的检测,通过上述方法检测出进程3持有分布式锁;进程4没有持有分布式锁;则进程3结束申请流程,进程4继续处理,基于进程4生成申请分布式锁的标志。B服务器中的进程5对应内存锁5;对进程5进行是否持有分布式锁的检测,通过上述方法检测出进程5没有持有分布式锁;则进程5继续处理,基于进程5生成申请分布式锁的标志。

步骤S3、基于所述申请分布式锁的标志和所述分布式锁的标识,发送取锁请求。

具体地,基于所述分布式锁的标识,在所述数据库中预设的分布式锁的数据表中查询分布式锁的标识对应的字段是否有所述标识;当所述标识存在时,基于所述申请分布式锁的标志和所述分布式锁的标识,发送所述取锁请求;当所述标识不存在时,在所述数据库的分布式锁的标识对应的字段中创建所述分布式锁的标识;再基于所述申请分布式锁的标志和所述分布式锁的标识,发送所述取锁请求。

进一步具体地,预先在数据库的分布式锁的数据表中设置有分布式锁的未持标志,当未持标志为1时,表示该分布式锁当前没有持有者;当未持标志为0时,表示该分布式锁当前已有持有者。在基于进程所争用的共享资源确定分布式锁的标识后,基于分布式锁的未持标志,确定该分布式锁的标识在分布式锁的数据表中是否存在,即当该标识存在时,基于该进程生成的申请分布式锁的标志和该分布式锁的标识向数据库发送取锁请求;当该标识不存在时,在数据库中创建争用共享资源的分布式锁的标识;再基于进程生成的申请分布式锁的标志和创建的分布式锁的标识向数据库发送取锁请求。通过上述处理方法,能够减少分布式锁在数据库中的创建。

举例来说,当共享资源争用的场景发生在单个服务器中时,A服务器中的进程1生成申请分布式锁的标志后,应用上述方法确定进程1对应的分布式锁标识,并基于申请分布式锁的标志和分布式锁的标识向数据库发送取锁请求。

当共享资源争用的场景发生在多个服务器之间时,上述A服务器中的进程4和B服务器中的进程5分别生成申请分布式锁的标志,并基于进程4、进程5争用的共享资源确定出的分布式锁的标识后,进程4、进程5分别基于各自的生成的申请分布式锁的标志、分布式锁的标识向数据库发送取锁请求。

步骤S4、数据库接收所述取锁请求,并基于所述分布式锁的标识进行空锁检测和锁超时检测,以确定将所述分布式锁分配给所述进程。

具体地,基于分布式锁的标识检测数据库中分布式锁的数据表中该分布式锁是否已被进程持有,以及若被进程持有,是否持有时间超过设定的阈值。所述数据库中预设的所述分布式锁的数据表的字段包括:第一分布式锁标识、第一持有者标志、第一持有时间点以及第一持有超时时长;基于所述分布式锁标识查询对应的所述第一持有者标志、所述第一持有时间点以及所述第一持有超时时长的字段是否都为空;当所述字段都为空时,基于所述进程,更新所述第一持有者标志、所述第一持有时间点以及所述第一持有超时时长的字段对应的内容,以确定将所述分布式锁分配给所述进程;当所述字段不为空时,查询所述第一持有超时时长的字段对应的数值,判断是否更新所述第一持有者标志、所述第一持有时间点以及所述第一持有超时时长;并基于判断结果处理是否将所述分布式锁分配给所述进程。

进一步具体地,当所述字段不为空时,查询所述第一持有超时时长的字段对应的数值,基于所述数值、所述第一持有时间点对应到的第一时间点以及当前时间,判断第一持有者标志对应的持有者持有所述分布式锁的时间是否超时;当判断结果为超时时,将所述第一持有者标志、所述第一持有时间点以及所述第一持有超时时长的字段对应的内容都设置为空;基于所述进程,更新所述第一持有者标志、所述第一持有时间点以及所述第一持有超时时长的字段对应的内容;当判断结果为未超时时,基于所述第一持有时间点、所述第一持有超时时长以及所述当前时间,在确定对应的持有者持有所述分布式锁的时间为超时时,再基于所述进程,更新所述第一持有者标志、所述第一持有时间点以及所述第一持有超时时长的字段对应的内容。

进一步具体地,在更新该标识对应的持有者标志、持有时间以及持有超时时长后,将分布式锁的未持标志由1改为0。

进一步具体地,分布式锁的数据表中的持有超时时长的字段,基于每个分布式锁都预先设有默认的超时时长,并可以根据业务情况单独为指定的分布式锁设置一个合适的超时时长,避免在特殊的业务场景下,默认的超时时长过长或过短的问题。

举例来说,当共享资源争用的场景发生在单个服务器中时,上述A服务器中的进程1发送的取锁请求后,应用上述方法进行空锁检测和锁超时检测,比如,该标识对应的持有者标志、持有时间点以及持有超时时长的字段都为空时,对应该进程更新该标识对应的持有者标志、持有时间点以及持有超时时长。

当共享资源争用的场景发生在多个服务器之间时,数据库接收到上述A服务器中的进程4、B服务器中的进程5分别发送的取锁请求,基于数据库自身的判断规则确定接收其中一个进程的取锁请求,比如接收进程5发送的取锁请求,之后应用上述方法进行空锁检测和锁超时检测。

进一步具体地,基于第一持有者标志,将更新后的持锁信息对应反馈至该进程,并将更新信息记录在进程中。

如图2所示,于本实施例中,本发明的分配锁实例图,先获取内存锁21,以确定持有所述内存锁的进程;对持有内存锁的进程进行持锁检测22;当所述进程未持有分布式锁时,生成申请分布式锁的标志23,并确定分布式锁的标识;基于所述申请分布式锁的标志和所述分布式锁的标识,发送取锁请求24,其中,当基于所述分布式锁的标识,在所述数据库中预设的分布式锁的数据表中查询分布式锁的标识对应的字段不存在所述标识时;在所述数据库的分布式锁的标识对应的字段中创建所述分布式锁的标识;再基于所述申请分布式锁的标志和所述分布式锁的标识,发送所述取锁请求;数据库接收所述取锁请求,并基于所述分布式锁的标识进行空锁检测和锁超时检测25,以确定将所述分布式锁分配给所述进程,并将分布式锁的未持标志由1改为0;进程申请到对应的分布式锁,在分布式锁的保护下完成对数据库中数据的操作,之后,当进程需要进行释放锁时,具体处理详见下述步骤。

当所述进程持有分布式锁时,基于所述进程、分布式锁的标识,发送释放锁请求;数据库接收所述释放锁请求,并基于所述分布式锁的标识,将预设的分布式锁的数据表中对应的字段内容更新为空,以确定将所述进程持有的所述分布式锁释放。

具体地,当进程需要释放分布式锁,先在服务器内获取内存锁,以确定持有内存锁的进程;在对持有内存锁的进程检测是否有分布式锁标识,当没有分布式锁标识时,不再进行后续释放锁的处理;当有分布式锁标识时,基于该进程生成释放锁请求,其中,释放锁请求中携带有该进程对应的分布式锁标识。数据库接收进程的释放锁请求,基于释放锁请求中携带的分布式锁标识,查询分布式锁的数据表;当查询到该分布式锁标识后,再查询该分布式锁标识对应的第一持有者标志的字段对应的内容,将分布式锁标识对应的内容和释放请求中的进程信息做比较,判断分布式锁标识对应的内容与释放锁请求中的进程信息是否匹配一致;当比较结果为匹配一致时,将分布式锁标识对应的第一持有者标志、第一持有时间点以及第一持有超时时长的字段对应的内容都置为空,以释放该进程的分布式锁。

进一步具体地,在将该标识对应的持有者标志、持有时间以及持有超时时长都置为空后,将分布式锁的未持标志由0改为1。基于数据库的分布式锁的数据表中已更新的该进程的分布式锁标识、持有者标志、持有时间点以及持有超时时长,以及基于释放锁请求,对应反馈至该进程,基于更新后的持锁信息,修改进程中对应的信息记录。

如图3所示,于本实施例中,本发明的释放锁实例图,先获取内存锁31,以确定持有所述内存锁的进程;对持有内存锁的进程进行持锁检测32;当所述进程持有分布式锁时,基于该进程生成释放锁请求33;数据库接收进程的释放锁请求,基于释放锁请求中携带的分布式锁标识进行持锁检测34,以释放该进程的分布式锁,将分布式锁的未持标志由0改为1;。

如图4所示,于本实施例中,本发明的基于数据库的分布式锁处理装置包括:

获取模块41,用于获取内存锁,以确定持有所述内存锁的进程;

处理模块42,用于当所述进程未持有分布式锁时,生成申请分布式锁的标志,并确定分布式锁的标识;

发送模块43,用于基于所述申请分布式锁的标志和所述分布式锁的标识,发送取锁请求;

确定模块44,用于数据库接收所述取锁请求,并基于所述分布式锁的标识进行空锁检测和锁超时检测,以确定将所述分布式锁分配给所述进程。

其中,处理模块42,具体用于当所述进程未持有所述分布式锁时,基于所述进程,生成申请所述分布式锁的标志;基于所述进程,获取所述进程争用的共享资源;基于所述共享资源确定分布式锁的标识。

本实施例的基于数据库的分布式锁处理装置具体实现的技术特征与实施例1中基于数据库的分布式锁处理装置方法中的各步骤的原理基本相同,方法和装置之间可以通用的技术内容不作重复赘述。

本发明的存储介质上存储有计算机程序,该程序被处理器执行时实现上述的基于数据库的分布式锁处理方法。

如图5所示,于本实施例中,本发明的基于数据库的分布式锁处理系统包括:处理器51及存储器52。

所述存储器52用于存储计算机程序。

所述存储器52包括:ROM、RAM、磁碟、U盘、存储卡或者光盘等各种可以存储程序代码的介质。

所述处理器51与所述存储器52相连,用于执行所述存储器52存储的计算机程序,以使所述弹框控制系统执行上述的基于数据库的分布式锁处理方法。

优选地,上述的处理器51可以是通用处理器,包括中央处理器(CentralProcessing Unit,简称CPU)、网络处理器(Network Processor,简称NP)、图形处理器(Graphic Processing Unit,GPU)等,其中,在实际应用中,主要采用的通用处理器是图形处理器;还可以是数字信号处理器(Digital Signal Processing,简称DSP)、专用集成电路(Application Specific Integrated Circuit,简称ASIC)、现场可编程门阵列(Field-Programmable Gate Array,简称FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。

综上所述,本发明的基于数据库的分布式锁处理方法及装置,能够能够避免请求锁的服务器在取锁过程中被阻塞;并且在取锁时判断当前锁是否超时,以避免因当前锁所在的服务器突然宕机,长时间无法释放锁,导致其他服务器一直无法获取到锁;此外当释放锁时,能够基于持有的分布式锁的标识进行准确释放。所以,本发明有效克服了现有技术中的种种缺点而具高度产业利用价值。

上述实施例仅例示性说明本发明的原理及其功效,而非用于限制本发明。任何熟悉此技术的人士皆可在不违背本发明的精神及范畴下,对上述实施例进行修饰或改变。因此,举凡所属技术领域中具有通常知识者在未脱离本发明所揭示的精神与技术思想下所完成的一切等效修饰或改变,仍应由本发明的权利要求所涵盖。

本文发布于:2023-04-14 21:17:27,感谢您对本站的认可!

本文链接:https://patent.en369.cn/patent/3/86858.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图