基于分布式锁的线程执行方法及装置、存储介质与流程

专利2022-06-29  85


本申请涉及分布式锁技术领域,尤其是涉及到一种基于分布式锁的线程执行方法及装置、存储介质、计算机设备。



背景技术:

在分布式环境下存在不同进程互斥地访问共享资源的问题。进程包含一个或多个线程,如果多个进程中的线程均需对共享资源进行操作,那么不同进程中线程访问共享资源时往往需要互斥访问,以防止彼此干扰。此情况下通常需要使用分布式锁。

在分布式锁中典型代表为redis,在redis中可以为一进程中的线程分配分布式锁,并且,设定分布式锁的使用时间,在该使用时间内该线程可以访问共享资源。

但是,在redis存在一些等待访问共享资源的线程,在一个线程的分布式锁超时的情况下,可能会出现两个及以上线程获得分布式锁的异常情况。例如,进行db读取时,可能存在数据库连接超时或者临时锁表或者java层面fullgc等一系列问题导致执行层面时间延长,本身运行时间超过了锁的锁定时间,相当于程序还没执行完,锁就失效了,在并发的情况下,如果又有一个请求进入,会直接拿到锁,程序中将会有两个线程执行一样的任务,产生脏数据。



技术实现要素:

有鉴于此,本申请提供了一种基于分布式锁的线程执行方法及装置、存储介质、计算机设备,有助于避免两个及以上线程获得分布式锁的异常情况。

根据本申请的一个方面,提供了一种基于分布式锁的线程执行方法,包括:

缓存服务器基于来自客户端的加锁请求,向所述客户端分配所述分布式锁;

所述客户端接收到所述分布式锁后,基于所述加锁请求建立任务线程以及监视线程;

利用所述任务线程执行与所述加锁请求对应的待执行任务,以及通过所述监视线程对执行超时的所述任务线程作出中断标记;

基于所述中断标记中断所述任务线程,并回滚所述任务线程对应的数据库资源。

具体地,所述向所述客户端分配所述分布式锁,具体包括:

为与所述加锁请求匹配的分布式锁设定过期时间后,向所述客户端分配所述分布式锁;

所述所述客户端接收到所述分布式锁后,基于所述加锁请求建立任务线程以及监视线程,具体包括:

所述客户端接收到所述分布式锁后,将所述加锁请求对应的代理对象放入预先建立的线程池中,其中,所述代理对象包括所述任务线程以及待执行任务;

在所述线程池中为所述任务线程分配对应的所述监视线程,其中,所述监视线程在系统时间超过所述过期时间时判定所述任务线程执行超时。

具体地,所述利用所述任务线程执行与所述加锁请求对应的待执行任务,具体包括:

判断所述待执行任务是否已被写入事务中;

若未写入事务中,则建立包含所述待执行任务的事务后,利用所述任务线程执行所述事务;

若已写入事务中,则利用所述任务线程执行所述事务。

具体地,所述方法还包括:

若所述任务线程执行结束并且不包含所述中断标记,则提交所述任务线程对应的所述事务。

具体地,所述所述客户端接收到所述分布式锁后之后,所述方法还包括:

记录接收到所述分布式锁时的时间戳信息;

所述基于所述中断标记中断所述任务线程,并回滚所述任务线程对应的数据库资源,具体包括:

若所述待执行任务为i/o密集型任务,则在所述监视线程对所述任务线程作出所述中断标记时,立即中断所述任务线程并将所述数据库资源回滚至与所述时间戳信息相应的时间节点。

具体地,所述加锁请求包括分布式锁标识信息,所述缓存服务器基于来自客户端的加锁请求,为与所述加锁请求匹配的分布式锁设定过期时间后,向所述客户端分配所述分布式锁,具体包括:

缓存服务器基于所述加锁请求中的所述分布式锁标识信息,检查相应的所述分布式锁是否正在被占用;

若所述分布式锁未被占用,则获取所述分布式锁的加锁时间,并基于所述加锁时间为所述分布式锁设定所述过期时间后将其分配至所述客户端中,其中,所述过期时间为当前时间与所述加锁时间之和;

若所述分布式锁已被占用,则向所述客户端返回加锁失败信息。

具体地,所述分布式锁的加锁时间基于所述加锁请求获取和/或基于所述分布式锁对应的预设加锁时间映射表获取。

根据本申请的另一方面,提供了一种基于分布式锁的线程执行装置,包括:

分布式锁分配模块,用于缓存服务器基于来自客户端的加锁请求,向所述客户端分配所述分布式锁;

线程建立模块,用于所述客户端接收到所述分布式锁后,基于所述加锁请求建立任务线程以及监视线程;

线程执行模块,用于利用所述任务线程执行与所述加锁请求对应的待执行任务,以及通过所述监视线程对执行超时的所述任务线程作出中断标记;

资源回滚模块,用于基于所述中断标记中断所述任务线程,并回滚所述任务线程对应的数据库资源。

具体地,所述线程建立模块,具体用于为与所述加锁请求匹配的分布式锁设定过期时间后,向所述客户端分配所述分布式锁;

所述线程建立模块,具体包括:

任务线程建立单元,用于所述客户端接收到所述分布式锁后,将所述加锁请求对应的代理对象放入预先建立的线程池中,其中,所述代理对象包括所述任务线程以及待执行任务;

监视线程建立单元,用于在所述线程池中为所述任务线程分配对应的所述监视线程,其中,所述监视线程在系统时间超过所述过期时间时判定所述任务线程执行超时。

具体地,所述线程执行模块,具体包括:

事务检测单元,用于判断所述待执行任务是否已被写入事务中;

事务建立单元,用于若未写入事务中,则建立包含所述待执行任务的事务后,利用所述任务线程执行所述事务;

事务执行单元,用于若已写入事务中,则利用所述任务线程执行所述事务。

具体地,所述装置还包括:

事务提交模块,用于若所述任务线程执行结束并且不包含所述中断标记,则提交所述任务线程对应的所述事务。

具体地,所述装置还包括:

时间戳记录模块,用于所述客户端接收到所述分布式锁后之后,记录接收到所述分布式锁时的时间戳信息;

所述资源回滚模块,具体用于若所述待执行任务为i/o密集型任务,则在所述监视线程对所述任务线程作出所述中断标记时,立即中断所述任务线程并将所述数据库资源回滚至与所述时间戳信息相应的时间节点。

具体地,所述加锁请求包括分布式锁标识信息,所述分布式锁分配模块,具体包括:

分布式锁检测单元,用于缓存服务器基于所述加锁请求中的所述分布式锁标识信息,检查相应的所述分布式锁是否正在被占用;

分布式锁分配单元,用于若所述分布式锁未被占用,则获取所述分布式锁的加锁时间,并基于所述加锁时间为所述分布式锁设定所述过期时间后将其分配至所述客户端中,其中,所述过期时间为当前时间与所述加锁时间之和;

失败提示单元,用于若所述分布式锁已被占用,则向所述客户端返回加锁失败信息。

具体地,所述分布式锁的加锁时间基于所述加锁请求获取和/或基于所述分布式锁对应的预设加锁时间映射表获取。

依据本申请又一个方面,提供了一种存储介质,其上存储有计算机程序,所述程序被处理器执行时实现上述基于分布式锁的线程执行方法。

依据本申请再一个方面,提供了一种计算机设备,包括存储介质、处理器及存储在存储介质上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述基于分布式锁的线程执行方法。

借由上述技术方案,本申请提供的一种基于分布式锁的线程执行方法及装置、存储介质、计算机设备,客户端获取分布式锁后,除建立用于执行分布式锁相关任务的任务线程外,还建立了用于监视任务线程是否超时的监视线程,监视线程可以在任务线程执行超时时做出中断标记,客户端基于中断标记终止任务线程继续执行,并将该任务线程对应的数据库资源进行回滚。本申请实施例适用于各种并发场景以及异常超时场景的分布式加锁业务,利用所建立的监视线程对任务线程的超时执行行为进行监视,作出中断标记,以便及时中断超时的任务线程并回滚相应的数据库资源,避免同一分布式锁被同时分配给多个线程以及避免分布式锁对应的数据库资源被同时调用产生脏数据。

上述说明仅是本申请技术方案的概述,为了能够更清楚了解本申请的技术手段,而可依照说明书的内容予以实施,并且为了让本申请的上述和其它目的、特征和优点能够更明显易懂,以下特举本申请的具体实施方式。

附图说明

此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:

图1示出了本申请实施例提供的一种基于分布式锁的线程执行方法的流程示意图;

图2示出了本申请实施例提供的另一种基于分布式锁的线程执行方法的流程示意图;

图3示出了本申请实施例提供的一种基于分布式锁的线程执行装置的结构示意图;

图4示出了本申请实施例提供的另一种基于分布式锁的线程执行装置的结构示意图。

具体实施方式

下文中将参考附图并结合实施例来详细说明本申请。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。

在本实施例中提供了一种基于分布式锁的线程执行方法,如图1所示,该方法包括:

步骤101,缓存服务器基于来自客户端的加锁请求,向客户端分配分布式锁。

在上述实施例中,缓存服务器与客户端之间可以通过有线连接方式或者无线连接方式通信,缓存服务器能够接收到客户端发送的加锁请求,并基于该加锁请求,在缓存服务器中保存的分布式锁中找出与之匹配的分布式锁,将该分布式锁返回到客户端中。

步骤102,客户端接收到分布式锁后,基于加锁请求建立任务线程以及监视线程。

步骤103,利用任务线程执行与加锁请求对应的待执行任务,以及利用监视线程基于分布式锁的过期时间对执行超时的任务线程作出中断标记。

在上述实施例中,将分布式锁分配到客户端后,相应的客户端就具备了对该分布式锁对应的数据库共享资源的访问权限,客户端接收到分布式锁后,建立与加锁请求对应的任务线程,并为该任务线程分配一个监视线程,其中,任务线程用于执行该加锁请求对应的待执行任务,监视线程用于监视任务线程,具体用于监视任务线程是否执行超时,任务线程是否执行超时是基于分布式锁的过期时间来确定的。建立任务线程和监视线程后,就可以利用任务线程执行相应的任务,以及利用监视线程对任务线程进行监视,并在任务线程执行超时时,或者说分布式锁过期时,将该任务线程标记为中断线程。

步骤104,基于中断标记中断任务线程,并回滚任务线程对应的数据库资源。

当任务线程被标记为中断线程时,说明该任务线程执行超时,该任务线程对应的分布式锁已经过期,在上文中已经提到了对于过期的分布式锁,缓存服务器会将其释放,以便进行下一次分配,但是对于分布式锁的释放只对缓存服务器侧进行约束,如果客户端a调用分布式锁甲已经超时,缓存服务器又将分布式锁甲分配给了客户端b,那么将可能同时存在客户端a和客户端b同时调用分布式锁甲对应的数据库共享资源,造成脏数据产生,为了避免这种情况发生,本申请实施例在任务线程执行超时被监视线程作出中断标记时,应将任务线程中断,以阻止其继续执行并将任务线程调用的数据库资源进行回滚,本申请实施例提供的方法可以适用于各种并发场景以及异常超时场景的分布式加锁业务。

通过应用本实施例的技术方案,客户端获取分布式锁后,除建立用于执行分布式锁相关任务的任务线程外,还建立了用于监视任务线程是否超时的监视线程,监视线程可以在任务线程执行超时时做出中断标记,客户端基于中断标记终止任务线程继续执行,并将该任务线程对应的数据库资源进行回滚。本申请实施例适用于各种并发场景以及异常超时场景的分布式加锁业务,利用所建立的监视线程对任务线程的超时执行行为进行监视,作出中断标记,以便及时中断超时的任务线程并回滚相应的数据库资源,避免同一分布式锁被同时分配给多个线程以及避免分布式锁对应的数据库资源被同时调用产生脏数据。

进一步的,作为上述实施例具体实施方式的细化和扩展,为了完整说明本实施例的具体实施过程,提供了另一种基于分布式锁的线程执行方法,如图2所示,该方法包括:

步骤201,缓存服务器基于加锁请求中的分布式锁标识信息,检查相应的分布式锁是否正在被占用;

步骤202,若分布式锁未被占用,则获取分布式锁的加锁时间,并基于加锁时间为分布式锁设定过期时间后将其分配至客户端中,其中,过期时间为当前时间与加锁时间之和;

步骤203,若分布式锁已被占用,则向客户端返回加锁失败信息。

具体地,分布式锁的加锁时间基于加锁请求获取和/或基于分布式锁对应的预设加锁时间映射表获取。

在上述实施例中,加锁请求包括分布式锁标识信息,标识信息是用于唯一识别分布式锁的数据,比如数字和/或字母组成的字符串等,缓存服务器接收到加锁请求后,通过读取预置的标识列表检查与加锁请求相应的分布式锁是否被占用,其中,标识列表用于存储被占用的分布式锁的标识,根据加锁请求指示的分布式锁的标识作为目标标识,查询标识列表中是否存在上述目标标识,若存在,则确定分布式锁被占用,向客户端返回加锁失败信息,若不存在,则确定分布式锁未被占用,向客户端分配分布式锁,每个分布式锁在锁定时都会被设定一个过期时间,过期时间具体可以根据加锁请求中包含的加锁时间来确定,也可以预先为每个分布式锁分配一个特定的加锁时间,即根据预设加锁时间映射表获取,另外,过期时间=当前时间 加锁时间。

需要说明的是,过期时间规定了分布式锁的最大占用时间,缓存服务器可以利用为分布式锁分配的过期时间,确定分布式锁的释放时间,即当缓存服务器的系统时间来到过期时间时,该分布式锁被释放,被释放的分布式锁可以被再次分配,也就是说,某个分布式锁的过期时间也就是该分布式锁可以被再次分配的时间,例如客户端a请求分布式锁甲,缓存服务器为分布式锁甲分配的过期时间为10分钟,那么客户端a对分布式锁甲的本次请求最多只能占用分布式锁甲10分钟,10分钟之后,无论客户端a是否已经利用该分布式锁甲执行完毕任务,缓存服务器都会将甲释放,以保证其他客户端或者客户端a再次对分布式锁甲进行请求分配。

步骤204,客户端接收到分布式锁后,记录接收到分布式锁时的时间戳信息。

客户端在接收到分布式锁之后,将接收到分布式锁对应的时间戳信息记录下来,以便确定需要进行资源回滚时,回滚的时间节点。

步骤205,将加锁请求对应的代理对象放入预先建立的线程池中,其中,代理对象包括任务线程以及待执行任务。

步骤206,在线程池中为任务线程分配对应的监视线程,其中,监视线程在系统时间超过过期时间时判定任务线程执行超时。

在上述实施例中,客户端需要预先根据cpu核心数建立一个线程池,例如建立一个cpu核心数*2的线程池,接收到分布式锁之后,将加锁请求对应的代理对象放入线程池中,代理对象包括任务线程和待执行任务,将其放入线程池中,可以利用线程池中的任务线程执行其中的待执行任务。另外,还需要在线程池中为代理对象分配一个监视线程,以监视任务线程是否超时,若客户端的系统时间超过过期时间则超时,在任务线程上作出中断标记。

步骤207,判断待执行任务是否已被写入事务中。

步骤208,若未写入事务中,则建立包含待执行任务的事务后,利用任务线程执行事务。

步骤209,若已写入事务中,则利用任务线程执行事务。

在上述步骤207至步骤209中,在任务线程执行任务之前,需要先判断代理对象中包含的待执行任务是否已经被写入事务中,其中,事务中应包含代理对象对应的全部待执行任务,这些任务被写入事务中,就会具备全部执行成功或全部执行失败的特性,以免分布式锁过期,任务线程执行超时导致数据库资源产生脏数据。进一步地,如果已写入事务中,则可以直接利用建立的任务线程执行事务,而如果未写入事务中,则将代理对象对应的全部待执行任务写入一个新建事务中后,再利用任务线程执行这个新建事务。

步骤210,通过监视线程对执行超时的任务线程作出中断标记。

利用监视线程对任务线程进行监视,并在任务线程执行超时、分布式锁过期时,对该任务线程标出中断标记。监视线程在对任务线程作出中断标记后结束,或者在任务线程执行完毕后结束。

步骤211,若待执行任务为i/o密集型任务,则在监视线程对任务线程作出中断标记时,立即中断任务线程并将数据库资源回滚至与时间戳信息相应的时间节点。

任务分为计算密集型和io密集型。计算密集型任务的特点是要进行大量的计算,消耗cpu资源,比如计算圆周率、对视频进行高清解码等等,全靠cpu的运算能力。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,cpu执行任务的效率就越低,所以,要最高效地利用cpu,计算密集型任务同时进行的数量应当等于cpu的核心数。第二种任务的类型是io密集型,涉及到网络、磁盘io的任务都是io密集型任务,这类任务的特点是cpu消耗很少,任务的大部分时间都在等待io操作完成(因为io的速度远远低于cpu和内存的速度)。对于io密集型任务,任务越多,cpu效率越高,但也有一个限度。常见的大部分任务都是io密集型任务,比如web应用。

对于i/o密集型任务,由于大部分时间都在等待io操作完成,或者说大部分时间处于休眠状态,因此,当任务线程被标记上中断标记时,如果该任务线程处于休眠状态则立即中断该任务线程,并基于步骤204中获取到的时间戳信息进行数据库资源回滚,具体应将数据库资源回滚至与该时间戳信息相应的时间节点,即使该任务线程当前时刻处于非休眠状态,由于i/o密集型任务的特性,任务线程也会很快进入休眠状态,只需要等待其进入休眠状态再进行中断和回滚即可。避免在一个线程的分布式锁超时的情况下,可能会出现两个及以上线程获得分布式锁的异常情况。对于极少数的计算密集型任务,则应该在任务线程执行结束后,再进行资源回滚,以免暴力中断正在执行任务的线程导致数据库资源丢失。

举例来说,如果分布式锁1之前分配给了a线程,分布式锁超时后a线程仍然没有执行完还在继续执行,此时有b线程也请求分布式锁1,基于这种情况,分布式锁的释放与分配和线程的执行按照下述规则进行:

1、分布式锁的释放与分配。只要分布式锁超时,就会将其释放,a线程对应的分布式锁超时,分布式锁1被释放,并在b线程请求分布式锁1时,将分布式锁1分配给b线程;

2、线程的执行。首先,当a线程对应的分布式锁超时,a线程对应的监视线程会在a线程上做出中断标记;其次,在a线程被打上中断标记后,判断a线程是否处于休眠状态;然后,在判断a线程处于休眠状态时,直接中断a线程并回滚,在判断a线程不处于休眠状态时,等到a线程执行结束后执行回滚。

进一步的,作为图1方法的具体实现,本申请实施例提供了一种基于分布式锁的线程执行装置,如图3所示,该装置包括:分布式锁分配模块31、线程建立模块32、线程执行模块33、资源回滚模块34。

分布式锁分配模块31,用于缓存服务器基于来自客户端的加锁请求,向客户端分配分布式锁;

线程建立模块32,用于客户端接收到分布式锁后,基于加锁请求建立任务线程以及监视线程;

线程执行模块33,用于利用任务线程执行与加锁请求对应的待执行任务,以及通过监视线程对执行超时的任务线程作出中断标记;

资源回滚模块34,用于基于中断标记中断任务线程,并回滚任务线程对应的数据库资源。

分布式锁分配模块31,具体用于为与加锁请求匹配的分布式锁设定过期时间后,向客户端分配分布式锁。

在具体的应用场景中,如图4所示,线程建立模块32,具体包括:任务线程建立单元321、监视线程建立单元322。

任务线程建立单元321,用于客户端接收到分布式锁后,将加锁请求对应的代理对象放入预先建立的线程池中,其中,代理对象包括任务线程以及待执行任务;

监视线程建立单元322,用于在线程池中为任务线程分配对应的监视线程,其中,监视线程在系统时间超过过期时间时判定任务线程执行超时。

在具体的应用场景中,如图4所示,线程执行模块33,具体包括:事务检测单元331、事务建立单元332、事务执行单元333。

事务检测单元331,用于判断待执行任务是否已被写入事务中;

事务建立单元332,用于若未写入事务中,则建立包含待执行任务的事务后,利用任务线程执行事务;

事务执行单元333,用于若已写入事务中,则利用任务线程执行事务。

在具体的应用场景中,如图4所示,该装置还包括:事务提交模块35、时间戳记录模块36、资源回滚模块37。

事务提交模块35,用于若任务线程执行结束并且不包含中断标记,则提交任务线程对应的事务。

时间戳记录模块36,用于客户端接收到分布式锁后之后,记录接收到分布式锁时的时间戳信息;

资源回滚模块34,具体用于若待执行任务为i/o密集型任务,则在监视线程对任务线程作出中断标记时,立即中断任务线程并将数据库资源回滚至与时间戳信息相应的时间节点。

在具体的应用场景中,如图4所示,加锁请求包括分布式锁标识信息,分布式锁分配模块31,具体包括:分布式锁检测单元311、分布式锁分配单元312、失败提示单元313。

分布式锁检测单元311,用于缓存服务器基于加锁请求中的分布式锁标识信息,检查相应的分布式锁是否正在被占用;

分布式锁分配单元312,用于若分布式锁未被占用,则获取分布式锁的加锁时间,并基于加锁时间为分布式锁设定过期时间后将其分配至客户端中,其中,过期时间为当前时间与加锁时间之和;

失败提示单元313,用于若分布式锁已被占用,则向客户端返回加锁失败信息。

在具体的应用场景中,分布式锁的加锁时间基于加锁请求获取和/或基于分布式锁对应的预设加锁时间映射表获取。

需要说明的是,本申请实施例提供的一种线程执行装置所涉及各功能单元的其他相应描述,可以参考图1和图2中的对应描述,在此不再赘述。

基于上述如图1和图2所示方法,相应的,本申请实施例还提供了一种存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述如图1和图2所示的基于分布式锁的线程执行方法。

基于这样的理解,本申请的技术方案可以以软件产品的形式体现出来,该软件产品可以存储在一个非易失性存储介质(可以是cd-rom,u盘,移动硬盘等)中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施场景所述的方法。

基于上述如图1、图2所示的方法,以及图3、图4所示的虚拟装置实施例,为了实现上述目的,本申请实施例还提供了一种计算机设备,具体可以为个人计算机、服务器、网络设备等,该计算机设备包括存储介质和处理器;存储介质,用于存储计算机程序;处理器,用于执行计算机程序以实现上述如图1和图2所示的基于分布式锁的线程执行方法。

可选地,该计算机设备还可以包括用户接口、网络接口、摄像头、射频(radiofrequency,rf)电路,传感器、音频电路、wi-fi模块等等。用户接口可以包括显示屏(display)、输入单元比如键盘(keyboard)等,可选用户接口还可以包括usb接口、读卡器接口等。网络接口可选的可以包括标准的有线接口、无线接口(如蓝牙接口、wi-fi接口)等。

本领域技术人员可以理解,本实施例提供的一种计算机设备结构并不构成对该计算机设备的限定,可以包括更多或更少的部件,或者组合某些部件,或者不同的部件布置。

存储介质中还可以包括操作系统、网络通信模块。操作系统是管理和保存计算机设备硬件和软件资源的程序,支持信息处理程序以及其它软件和/或程序的运行。网络通信模块用于实现存储介质内部各组件之间的通信,以及与该实体设备中其它硬件和软件之间通信。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到本申请可以借助软件加必要的通用硬件平台的方式来实现,也可以通过硬件实现客户端获取分布式锁后,除建立用于执行分布式锁相关任务的任务线程外,还建立了用于监视任务线程是否超时的监视线程,监视线程可以在任务线程执行超时时做出中断标记,客户端基于中断标记终止任务线程继续执行,并将该任务线程对应的数据库资源进行回滚。本申请实施例适用于各种并发场景以及异常超时场景的分布式加锁业务,利用所建立的监视线程对任务线程的超时执行行为进行监视,作出中断标记,以便及时中断超时的任务线程并回滚相应的数据库资源,避免同一分布式锁被同时分配给多个线程以及避免分布式锁对应的数据库资源被同时调用产生脏数据。

本领域技术人员可以理解附图只是一个优选实施场景的示意图,附图中的模块或流程并不一定是实施本申请所必须的。本领域技术人员可以理解实施场景中的装置中的模块可以按照实施场景描述进行分布于实施场景的装置中,也可以进行相应变化位于不同于本实施场景的一个或多个装置中。上述实施场景的模块可以合并为一个模块,也可以进一步拆分成多个子模块。

上述本申请序号仅仅为了描述,不代表实施场景的优劣。以上公开的仅为本申请的几个具体实施场景,但是,本申请并非局限于此,任何本领域的技术人员能思之的变化都应落入本申请的保护范围。


技术特征:

1.一种基于分布式锁的线程执行方法,其特征在于,包括:

缓存服务器基于来自客户端的加锁请求,向所述客户端分配所述分布式锁;

所述客户端接收到所述分布式锁后,基于所述加锁请求建立任务线程以及监视线程;

利用所述任务线程执行与所述加锁请求对应的待执行任务,以及通过所述监视线程对执行超时的所述任务线程作出中断标记;

基于所述中断标记中断所述任务线程,并回滚所述任务线程对应的数据库资源。

2.根据权利要求1所述的方法,其特征在于,所述向所述客户端分配所述分布式锁,具体包括:

为与所述加锁请求匹配的分布式锁设定过期时间后,向所述客户端分配所述分布式锁;

所述客户端接收到所述分布式锁后,基于所述加锁请求建立任务线程以及监视线程,具体包括:

所述客户端接收到所述分布式锁后,将所述加锁请求对应的代理对象放入预先建立的线程池中,其中,所述代理对象包括所述任务线程以及待执行任务;

在所述线程池中为所述任务线程分配对应的所述监视线程,其中,所述监视线程在系统时间超过所述过期时间时判定所述任务线程执行超时。

3.根据权利要求2所述的方法,其特征在于,所述利用所述任务线程执行与所述加锁请求对应的待执行任务,具体包括:

判断所述待执行任务是否已被写入事务中;

若未写入事务中,则建立包含所述待执行任务的事务后,利用所述任务线程执行所述事务;

若已写入事务中,则利用所述任务线程执行所述事务。

4.根据权利要求3所述的方法,其特征在于,所述方法还包括:

若所述任务线程执行结束并且不包含所述中断标记,则提交所述任务线程对应的所述事务。

5.根据权利要求1至4中任一项所述的方法,其特征在于,所述所述客户端接收到所述分布式锁后之后,所述方法还包括:

记录接收到所述分布式锁时的时间戳信息;

所述基于所述中断标记中断所述任务线程,并回滚所述任务线程对应的数据库资源,具体包括:

若所述待执行任务为i/o密集型任务,则在所述监视线程对所述任务线程作出所述中断标记时,立即中断所述任务线程并将所述数据库资源回滚至与所述时间戳信息相应的时间节点。

6.根据权利要求5所述的方法,其特征在于,所述加锁请求包括分布式锁标识信息,所述缓存服务器基于来自客户端的加锁请求,为与所述加锁请求匹配的分布式锁设定过期时间后,向所述客户端分配所述分布式锁,具体包括:

缓存服务器基于所述加锁请求中的所述分布式锁标识信息,检查相应的所述分布式锁是否正在被占用;

若所述分布式锁未被占用,则获取所述分布式锁的加锁时间,并基于所述加锁时间为所述分布式锁设定所述过期时间后将其分配至所述客户端中,其中,所述过期时间为当前时间与所述加锁时间之和;

若所述分布式锁已被占用,则向所述客户端返回加锁失败信息。

7.根据权利要求6所述的方法,其特征在于,所述分布式锁的加锁时间基于所述加锁请求获取和/或基于所述分布式锁对应的预设加锁时间映射表获取。

8.一种基于分布式锁的线程执行装置,其特征在于,包括:

分布式锁分配模块,用于缓存服务器基于来自客户端的加锁请求,向所述客户端分配所述分布式锁;

线程建立模块,用于所述客户端接收到所述分布式锁后,基于所述加锁请求建立任务线程以及监视线程;

线程执行模块,用于利用所述任务线程执行与所述加锁请求对应的待执行任务,以及通过所述监视线程对执行超时的所述任务线程作出中断标记;

资源回滚模块,用于基于所述中断标记中断所述任务线程,并回滚所述任务线程对应的数据库资源。

9.一种存储介质,其上存储有计算机程序,其特征在于,所述程序被处理器执行时实现权利要求1至7中任一项所述的基于分布式锁的线程执行方法。

10.一种计算机设备,包括存储介质、处理器及存储在存储介质上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现权利要求1至7中任一项所述的基于分布式锁的线程执行方法。

技术总结
本申请公开了一种基于分布式锁的线程执行方法及装置、存储介质、计算机设备,该方法包括:缓存服务器基于来自客户端的加锁请求,向客户端分配分布式锁;客户端接收到分布式锁后,基于加锁请求建立任务线程以及监视线程;利用任务线程执行与加锁请求对应的待执行任务,以及通过监视线程对执行超时的任务线程作出中断标记;基于中断标记中断任务线程,并回滚任务线程对应的数据库资源。本申请利用所建立的监视线程对任务线程的超时执行行为进行监视作出中断标记,以便及时中断超时的任务线程并回滚相应的数据库资源,避免同一分布式锁被同时分配给多个线程以及避免分布式锁对应的数据库资源被同时调用产生脏数据。

技术研发人员:徐亮
受保护的技术使用者:平安医疗健康管理股份有限公司
技术研发日:2020.01.16
技术公布日:2020.06.09

转载请注明原文地址: https://bbs.8miu.com/read-25614.html

最新回复(0)