掌桥专利:专业的专利平台
掌桥专利
首页

自动延时的分布式重入锁控制方法

文献发布时间:2024-04-18 19:59:31


自动延时的分布式重入锁控制方法

技术领域

本发明属于计算机软件多进程领域,尤其涉及到一种自动延时的分布式重入锁控制方法。

背景技术

在软件分布式应用中,常有一些操作需要单线程去处理,防范多节点带来的处理风险,需要对某些节点任务进行锁定。比如:处理一个文件入数据库;从数据库统计记录信息到文件等等。

目前常用的分布式锁实现方案有redis分布式锁,sql+forupdate语句加锁等等,以下简单举例说明redis和sql+forupdate方法的缺点情况:

方案一(redis分布式锁):

此方案在异常情况下若redis锁不能释放,其他线程很难获取锁,造成业务处理异常,虽然redis锁也提供了超时时间,但是在超时时间范围之内,业务处理也会受影响,并且不支持代码嵌套获取锁调用,也不支持多线程调用。

方案二(sql+forupdate):

此方案主要以sql加forupdate进行加锁,在库连接出现异常时容易出现意向锁死锁问题,出现这种问题只能人工介入进行处理,业务不能快速恢复。业务处理时间过长,容易导致数据库连接浪费不能回收问题。

发明内容

本发明的一个目的是提供一种自动延时的分布式重入锁控制方法,并提供至少后面将说明的优点。

本发明的另一个目的是提供一种自动延时的分布式重入锁控制方法,若锁释放异常时相同分布式节点加入了同节点锁重入的设计,加入了栈计数功能,支持代码嵌套获取锁,同时也引入了线程锁能力,保证了不同线程间安全;每次数据库操作时间很短,能快速的释放数据库连接,获得锁的代码块不用考虑任务处理时长的问题。

本发明的技术方案如下:

自动延时的分布式重入锁控制方法,其包括以下步骤:

创建锁信息数据库,其中包括锁ID、锁标题、分布式节点编号、超时时长和更新时间;

构造分布式节点线程锁,其中包括锁ID、分布式节点编号和数据库连接池;

和根据锁ID获取当前线程锁进行加锁;

其中,

根据锁ID获取当前线程锁进行加锁包括:

栈计数成功时,栈计数加一;当栈计数不成功时,将栈计数设置为零之后开启数据库事务;

根据锁ID更新一条数据,查询锁ID对应的数据库中的信息,判断是否存在分布式节点ID以及是否为当前分布式节点ID,当不存在分布式节点ID或者分布式节点ID与当前分布式节点ID相等,或者分布式节点ID与当前分布式节点ID不相等但是已超时的时候,更新锁ID对应的数据库记录为当前分布式节点ID,并设置超时时长,完成数据库事务,开启延时线程;若上述操作不成功则回退重新开启数据库事务。

优选的是,所述的自动延时的分布式重入锁控制方法中,还包括解锁,其包括:

判断栈计数是否等于0;

不相等时,栈计数减1,并根据锁ID获取线程锁进行解锁;

相等时,删除判断栈计数,设置延时线程标识等于false,打断延时线程,等待延时线程结束,开始数据库事务;

根据锁ID更新一条数据,查询锁ID对应的数据库中的信息,判断分布式节点ID与当前锁定节点ID是否相同,当相同时,更新锁ID对应的数据库记录当前分布式节点ID=null,超时时长为null,完成数据库事务,根据锁ID获取线程锁进行解锁;若上述操作不成功则回退重新开始数据库事务。

优选的是,所述的自动延时的分布式重入锁控制方法中,还包括线程延时,其包括:

判断延时线程运行标志是否等于true;当相等时开启数据库事务;

根据根据锁ID更新一条数据,查询锁ID对应的数据库中的信息,判断分布式节点ID与当前锁定节点ID是否相同;

当相同时根据锁ID和分布式节点ID条件更新数据表进行超时延时,或者当不相同时,完成数据库事务,线程延时;若上述操作不成功,则回退重新判断延时线程运行标志是否等于true。

本发明具有以下有益效果:

1)锁接口规范性,分布式锁实现了标准接口,比较规范。

2)锁的重入性,设置有栈计数,分布式锁可以嵌套调用,使用特性表现和线程锁一样。

3)同进程不同线程的安全性,分布式锁中嵌套了线程锁,可以保证进程之间安全,保证同进程不同线程之间安全。

4)设计有延时线程,可以保证分布式锁在释放之前,自动延长超时时间,安全性有保证。

5)分布式锁采用数据库的可重复读特性进行实现,不易死锁。

6)同节点可重入性,在程序异常关闭时,若此节没有释放锁,重新起动程序可以再次获取锁,无需等待锁超时。

本发明的其它优点、目标和特征将部分通过下面的说明体现,部分还将通过对本发明的研究和实践而为本领域的技术人员所理解。

附图说明

图1为本发明提供的自动延时的分布式重入锁控制方法的一个实施例中加锁流程图;

图2为本发明提供的自动延时的分布式重入锁控制方法的一个实施例中解锁流程图;

图3为本发明提供的自动延时的分布式重入锁控制方法的一个实施例中线程延时流程图。

具体实施方式

下面结合附图对本发明做进一步的详细说明,以令本领域技术人员参照说明书文字能够据以实施。

应当理解,本文所使用的诸如“具有”、“包含”以及“包括”术语并不配出一个或多个其它元件或其组合的存在或添加。

如图1所示,本发明提供一种自动延时的分布式重入锁控制方法,其包括以下步骤:

创建锁信息数据库,其中包括锁ID、锁标题、分布式节点编号、超时时长和更新时间;

构造分布式节点线程锁,其中包括锁ID、分布式节点编号和数据库连接池;

和根据锁ID获取当前线程锁进行加锁;

其中,

根据锁ID获取当前线程锁进行加锁包括:

栈计数成功时,栈计数加一;当栈计数不成功时,将栈计数设置为零之后开启数据库事务;

根据锁ID更新一条数据,查询锁ID对应的数据库中的信息,判断是否存在分布式节点ID以及是否为当前分布式节点ID,当不存在分布式节点ID或者分布式节点ID与当前分布式节点ID相等,或者分布式节点ID与当前分布式节点ID不相等但是已超时的时候,更新锁ID对应的数据库记录为当前分布式节点ID,并设置超时时长,完成数据库事务,开启延时线程;若上述操作不成功则回退重新开启数据库事务。

本发明实现了java中java.util.concurrent.locks.Lock接口,实现了lock、unlock方法,遵循JDK规范,锁实现过程中采用数据库可重复读事务处理阻塞操作,需定义一张锁信息表(以mysql为例),如表1所示。

锁构造时需传入参数:锁ID、分布式节点编号、数据库连接池(或数据库连接信息)。

1.获取当前线程锁进行lock,保持同一进程中线程间互斥。

2.进行栈计数。

3.采用数据库可重读事务特性阻塞,判断且更新节点信息。

4.根据节点信息情况判断是否可获取锁(相同节点时也支持获取)。

5.若获取锁成功则开起延时线程,保持分布式锁在释放前锁定的节点安全。

6.未获取锁时则循环进行重新获取,保持lock方法的阻塞。

在本发明提供的所述的自动延时的分布式重入锁控制方法的一个实施例中,还包括解锁,如图2所示,其包括:

判断栈计数是否等于0;

不相等时,栈计数减1,并根据锁ID获取线程锁进行解锁;

相等时,删除判断栈计数,设置延时线程标识等于false,打断延时线程,等待延时线程结束,开始数据库事务;

根据锁ID更新一条数据,查询锁ID对应的数据库中的信息,判断分布式节点ID与当前锁定节点ID是否相同,当相同时,更新锁ID对应的数据库记录当前分布式节点ID=null,超时时长为null,完成数据库事务,根据锁ID获取线程锁进行解锁;若上述操作不成功则回退重新开始数据库事务。

1.进行栈计数处理,释放线程锁。

2.根据栈计数判断是否可释放分布式锁。

3.可释放分布锁时,打断延时线程,等待线程退出。

在本发明提供的所述的自动延时的分布式重入锁控制方法的一个实施例中,还包括线程延时,如图3所示,其包括:

判断延时线程运行标志是否等于true;当相等时开启数据库事务;

根据根据锁ID更新一条数据,查询锁ID对应的数据库中的信息,判断分布式节点ID与当前锁定节点ID是否相同;

当相同时根据锁ID和分布式节点ID条件更新数据表进行超时延时,或者当不相同时,完成数据库事务,线程延时;若上述操作不成功,则回退重新判断延时线程运行标志是否等于true。

1.判断线程标志状态,成功时则进行延时。

2.采用可重读事务特性阻塞,更新表中分布式锁节点的时长信息。

3.更新成功则进行线程睡眠等待下次更新。

4.更新失败时不进行睡眠进行下次更新。

尽管本发明的实施方案已公开如上,但其并不仅仅限于说明书和实施方式中所列运用,它完全可以被适用于各种适合本发明的领域,对于熟悉本领域的人员而言,可容易地实现另外的修改,因此在不背离权利要求及等同范围所限定的一般概念下,本发明并不限于特定的细节和这里示出与描述的图例。

技术分类

06120116525332