CN113760841A - 实现分布式锁的方法和装置 - Google Patents
实现分布式锁的方法和装置 Download PDFInfo
- Publication number
- CN113760841A CN113760841A CN202010603579.6A CN202010603579A CN113760841A CN 113760841 A CN113760841 A CN 113760841A CN 202010603579 A CN202010603579 A CN 202010603579A CN 113760841 A CN113760841 A CN 113760841A
- Authority
- CN
- China
- Prior art keywords
- thread
- data resource
- data
- lock
- resource
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 56
- 238000003780 insertion Methods 0.000 claims abstract description 124
- 230000037431 insertion Effects 0.000 claims abstract description 124
- 238000004590 computer program Methods 0.000 claims description 9
- 238000012545 processing Methods 0.000 claims description 9
- 238000012360 testing method Methods 0.000 claims description 9
- 239000000126 substance Substances 0.000 claims 1
- 238000011161 development Methods 0.000 abstract description 10
- 238000012423 maintenance Methods 0.000 abstract description 9
- 238000010586 diagram Methods 0.000 description 17
- 238000004891 communication Methods 0.000 description 7
- 230000006870 function Effects 0.000 description 6
- 230000008569 process Effects 0.000 description 6
- 238000005516 engineering process Methods 0.000 description 5
- 238000012217 deletion Methods 0.000 description 4
- 230000037430 deletion Effects 0.000 description 4
- 238000012986 modification Methods 0.000 description 4
- 230000004048 modification Effects 0.000 description 4
- 230000003287 optical effect Effects 0.000 description 4
- 230000008901 benefit Effects 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 239000000835 fiber Substances 0.000 description 2
- 230000007246 mechanism Effects 0.000 description 2
- 230000000644 propagated effect Effects 0.000 description 2
- 239000004065 semiconductor Substances 0.000 description 2
- 238000010276 construction Methods 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 230000007717 exclusion Effects 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 239000004973 liquid crystal related substance Substances 0.000 description 1
- 239000013307 optical fiber Substances 0.000 description 1
- 238000001228 spectrum Methods 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 230000001360 synchronised effect Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
- G06F16/17—Details of further file system functions
- G06F16/176—Support for shared access to files; File sharing support
- G06F16/1767—Concurrency control, e.g. optimistic or pessimistic approaches
- G06F16/1774—Locking methods, e.g. locking methods for file systems allowing shared and concurrent access to files
Abstract
本发明公开了实现分布式锁的方法和装置,涉及计算机技术领域。该方法的一具体实施方式包括:接收数据资源的访问请求,获取访问请求对应的至少一个线程和数据资源对应的唯一索引;基于唯一索引,控制至少一个线程向数据资源对应的共享锁表插入特定数据;获取至少一个线程对应的插入结果,根据插入结果,确定访问数据资源的线程。该实施方式能够通过唯一索引和共享锁表就可以实现分布式锁,避免现有技术的部署较为复杂、以及开发和维护成本较高的技术问题,操作难度低,用户体验好。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及一种实现分布式锁的方法和装置。
背景技术
分布式锁是控制分布式系统之间同步访问共享资源的一种方式。如果不同的系统或是同一个系统的不同设备之间共享了一个或一组资源,那么访问这些资源的时候,需要互斥来防止彼此干扰,以保证一致性,在这种情况下,便需要使用到分布式锁。分布式锁的作用就是让共享资源在并发情况下,同一时间只有一个线程能够操作共享资源,这个线程就是获取了锁的线程,并且其他线程也认同这把锁。
当前实现分布式锁的方法有以下几种:一、基于数据库锁实现分布式锁;二、基于缓存实现分布式锁;三、基于Zookeeper实现分布式锁。
在实现本发明过程中,发明人发现现有技术中至少存在如下问题:一、采用数据库锁实现的分布式锁,在解决问题的过程中,会导致整个方案变得复杂;二、采用缓存或者Zookeeper实现分布式锁的方法中,需要了解缓存技术或Zookeeper技术,对开发者要求比较高,导致系统比较复杂,增加了开发和维护成本。
发明内容
有鉴于此,本发明实施例提供一种实现分布式锁的方法和装置,能够通过唯一索引和共享锁表就可以实现分布式锁,操作难度低,用户体验好。
为实现上述目的,根据本发明实施例的第一方面,提供了一种实现分布式锁的方法。
本发明实施例的一种实现分布式锁的方法,包括:接收数据资源的访问请求,获取所述访问请求对应的至少一个线程和所述数据资源对应的唯一索引;基于所述唯一索引,控制所述至少一个线程向所述数据资源对应的共享锁表插入特定数据;获取所述至少一个线程对应的插入结果,根据所述插入结果,确定访问所述数据资源的线程,以实现分布式锁。
可选地,所述获取所述至少一个线程对应的插入结果,根据所述插入结果,确定访问所述数据资源的线程,包括:获取所述至少一个线程中每个线程对应的插入结果,所述插入结果为插入成功和插入失败;根据所述每个线程对应的插入结果,确定插入成功的线程和插入失败的线程;确定所述插入成功的线程为访问所述数据资源的线程。
可选地,在确定所述插入成功的线程为访问所述数据资源的线程之后,所述方法还包括:在所述插入成功的线程访问所述数据资源后,从所述共享锁表中删除所述插入成功的线程对应的特定数据。
可选地,所述方法还包括:判断是否成功从所述共享锁表中删除所述插入成功的线程对应的特定数据,若否,则利用异步线程删除所述插入成功的线程对应的特定数据。
可选地,在确定插入成功的线程和插入失败的线程之后,所述方法还包括:向所述插入失败的线程返回访问请求失败的结果,接收所述插入失败的线程返回的再次请求;其中,所述再次请求为所述插入失败的线程根据所述结果和对应的需求,发送的访问所述数据资源的请求或者对所述数据资源进行测试的请求。
可选地,在控制所述至少一个线程向所述数据资源对应的共享锁表插入特定数据之前,所述方法还包括:构建所述数据资源对应的共享锁表。
可选地,所述唯一索引为所述数据资源的一个数据特征或者所述数据资源的多个数据特征的组合;以及所述特定数据包括:所述数据资源对应的唯一索引和属性数据,所述属性数据包括以下选项中至少一项:所述特定数据的唯一标识、所述特定数据的创建时间、以及所述数据资源的更新时间。
为实现上述目的,根据本发明实施例的第二方面,提供了一种实现分布式锁的装置。
本发明实施例的一种实现分布式锁的装置,包括:获取模块,用于接收数据资源的访问请求,获取所述访问请求对应的至少一个线程和所述数据资源对应的唯一索引;插入模块,用于基于所述唯一索引,控制所述至少一个线程向所述数据资源对应的共享锁表插入特定数据;确定模块,用于获取所述至少一个线程对应的插入结果,根据所述插入结果,确定访问所述数据资源的线程,以实现分布式锁。
可选地,所述确定模块还用于:获取所述至少一个线程中每个线程对应的插入结果,所述插入结果为插入成功和插入失败;根据所述每个线程对应的插入结果,确定插入成功的线程和插入失败的线程;确定所述插入成功的线程为访问所述数据资源的线程。
可选地,所述确定模块还用于:在所述插入成功的线程访问所述数据资源后,从所述共享锁表中删除所述插入成功的线程对应的特定数据。
可选地,所述装置还包括:删除模块,用于判断是否成功从所述共享锁表中删除所述插入成功的线程对应的特定数据,若否,则利用异步线程删除所述插入成功的线程对应的特定数据。
可选地,所述确定模块还用于:向所述插入失败的线程返回访问请求失败的结果,接收所述插入失败的线程返回的再次请求;其中,所述再次请求为所述插入失败的线程根据所述结果和对应的需求,发送的访问所述数据资源的请求或者对所述数据资源进行测试的请求。
可选地,所述插入模块还用于:构建所述数据资源对应的共享锁表。
可选地,所述唯一索引为所述数据资源的一个数据特征或者所述数据资源的多个数据特征的组合;以及所述特定数据包括:所述数据资源对应的唯一索引和属性数据,所述属性数据包括以下选项中至少一项:所述特定数据的唯一标识、所述特定数据的创建时间、以及所述数据资源的更新时间。
为实现上述目的,根据本发明实施例的第三方面,提供了一种电子设备。
本发明实施例的一种电子设备包括:一个或多个处理器;存储装置,用于存储一个或多个程序,当一个或多个程序被一个或多个处理器执行,使得一个或多个处理器实现本发明实施例的实现分布式锁的方法。
为实现上述目的,根据本发明实施例的第四方面,提供了一种计算机可读介质。
本发明实施例的一种计算机可读介质,其上存储有计算机程序,程序被处理器执行时实现本发明实施例的实现分布式锁的方法。
上述发明中的一个实施例具有如下优点或有益效果:在接收数据资源的访问请求后,获取到访问请求对应的至少一个线程和数据资源对应的唯一索引,至少一个线程可以基于唯一索引向共享锁表中插入数据,且仅有一个线程可以插入成功,代表可以访问数据资源,其他的线程均插入失败,从而可以实现分布式锁,能够避免现有技术的部署较为复杂、以及开发和维护成本较高的技术问题,且通过唯一索引和共享锁表就可以实现分布式锁,操作难度低,用户体验好。
上述的非惯用的可选方式所具有的进一步效果将在下文中结合具体实施方式加以说明。
附图说明
附图用于更好地理解本发明,不构成对本发明的不当限定。其中:
图1是根据本发明实施例的实现分布式锁的方法的主要步骤的示意图;
图2是根据本发明实施例的线程向共享锁表中插入特定数据的示意图;
图3是根据本发明实施例的实现分布式锁的示意图;
图4是根据本发明实施例的实现分布式锁的方法的主要流程的示意图;
图5是根据本发明实施例的实现分布式锁的装置的主要模块的示意图;
图6是本发明实施例可以应用于其中的示例性系统架构图;
图7是适于用来实现本发明实施例的终端设备或服务器的计算机系统的结构示意图。
具体实施方式
以下结合附图对本发明的示范性实施例做出说明,其中包括本发明实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本发明的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
现有技术主要基于数据库锁、缓存或者Zookeeper实现分布式锁。其中,基于数据库锁实现分布式锁的方法主要包括悲观锁方式和乐观锁方式。悲观锁方式是每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁、表锁、读锁、写锁等,都是在做操作之前先上锁。悲观锁可能会导致死锁问题,在高并发情况下,所有线程都需要同时等待,用户体验较差。乐观锁是每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。乐观锁需要增加额外的版本号字段,并且乐观锁并不一定靠谱,尤其是当锁表并不大的时候,另外如果是多表操作,那么版本号形式的乐观锁是无法满足要求的。总的来说,悲观锁方式和乐观锁方式在解决问题的过程中,会造成整个方案变得越来越复杂。
基于缓存(如Redis)实现分布式锁的方法中,需要使用者对缓存技术有一定的了解,需要部署缓存服务,很明显增加开发难度,而且此种方法中,为分布式锁设置的过期时间有很强的业务性,实用性较差。基于Zookeeper实现分布式锁的方法中,需要开发者对Zookeeper技术有一定的掌握,需要部署Zookeeper服务,对开发者要求比较高,导致系统比较复杂,增加了开发和维护成本。Zookeeper是一个分布式的,开放源码的分布式应用程序协调服务。
因此,当前实现分布式锁的方法中,操作难度较高,需要了解额外技术,部署较为复杂,开发和维护成本较高。为了解决这些问题,本发明实施例提供一种实现分布式锁的方法,能够利用唯一索引实现分布式锁。图1是根据本发明实施例的实现分布式锁的方法的主要步骤的示意图。如图1所示,实现分布式锁的方法的主要步骤可以包括步骤S101至步骤S103。
步骤S101:接收数据资源的访问请求,获取访问请求对应的至少一个线程和数据资源对应的唯一索引。
数据资源的访问请求是指访问某数据资源的请求,可以根据数据资源的访问请求,获取到同一时间请求访问该数据资源的至少一个线程,也可以获取到该数据资源对应的唯一索引。其中,唯一索引是指索引的一种,不允许具有索引值相同的行,从而禁止重复的索引或键值,系统在创建该索引时检查是否有重复的键值,并在每次使用插入或更新语句添加数据时进行检查。本发明实施例中,可以直接利用数据库的唯一索引特性,如Mysql数据库,在利用Mysql数据库存储的数据资源具有唯一索引特性,可以看出,本发明实施例的实现分布式锁的方法应用于具有唯一索引特性的数据库。
此外,唯一索引可以为数据资源的一个数据特征或者数据资源的多个数据特征的组合,比如某电商平台进行物品促销活动时,可能会有多个用户同时抢购某物品,由于该物品的库存有限,只有在物品库存量充足的情况下,用户才可以抢购成功。假设有10个用户在抢购该物品,那么需要按照顺序依次处理,前一个用户购买之后,该物品还有库存的情况下,下一个用户才可以购买,相当于是这10个用户并发请求抢购该物品,此种情况下的唯一索引可以是这个物品的唯一标识,如序列码,也可以是这个物品的多个特征的组合,如物品品牌、物品品类、物品型号的特征组合。
步骤S102:基于唯一索引,控制至少一个线程向数据资源对应的共享锁表插入特定数据。
共享锁表是指为请求访问的数据资源创建的表,本发明实施例中,针对不同的数据资源可以创建不同的共享锁表,比如订票系统中,有出票业务和退票业务,可以针对订票系统创建一个共享锁表,也可以针对出票业务和退票业务,分别创建对应的共享锁表。还有,针对不同车次的票,可以设置不同的共享锁表,比如可以创建北京到上海车次的共享锁表,还可以创建北京到广州车次的共享锁表,当然,共享锁表根据具体业务情况进行分析。因此,本发明的可参考实施例中,在控制至少一个线程向数据资源对应的共享锁表插入特定数据之前,实现分布式锁的方法还可以包括:构建数据资源对应的共享锁表。
至少一个线程向数据资源对应的共享锁表插入特定数据,该特定数据需要定义数据资源对应的唯一索引。如果线程A1至A10这10个线程请求访问数据资源D,且数据资源D对应的唯一索引为S,那么线程A1至A10同时向数据资源D对应的共享锁表插入唯一索引S对应的特定数据,考虑到唯一索引特性,因此在共享锁表中,最多只能有一条唯一索引S对应的特定数据,即只有一个线程可以成功将特定数据插入至共享锁表。
步骤S103:获取至少一个线程对应的插入结果,根据插入结果,确定访问数据资源的线程,以实现分布式锁。
其中,插入结果可以包括:插入成功和插入失败。至少一个线程向数据资源对应的共享锁表插入特定数据的情况下,只有一个线程可以插入成功,获取到每个线程的插入结果,且确定插入结果为插入成功的线程为可以访问该数据资源的线程。
考虑到分布式锁的作用就是让共享资源在并发情况下,同一时间只有一个线程能够操作共享资源,这个线程就是获取了锁的线程,并且其他线程也认同这把锁。因此,本发明实施例的实现分布式锁的方法,在接收数据资源的访问请求后,获取到访问请求对应的至少一个线程和数据资源对应的唯一索引,至少一个线程可以基于唯一索引向共享锁表中插入数据,且仅有一个线程可以插入成功,代表可以访问数据资源,其他的线程均插入失败,从而可以实现分布式锁,能够避免现有技术的部署较为复杂、以及开发和维护成本较高的技术问题,且通过唯一索引和共享锁表就可以实现分布式锁,操作难度低,用户体验好。
本发明的可参考实施例中,获取至少一个线程对应的插入结果,根据插入结果,确定访问数据资源的线程,可以包括:获取至少一个线程中每个线程对应的插入结果,插入结果为插入成功和插入失败;根据每个线程对应的插入结果,确定插入成功的线程和插入失败的线程;确定插入成功的线程为访问数据资源的线程。在步骤S103中提到过,插入结果可以包括插入成功和插入失败,若一个线程的插入结果为插入成功,则该线程可以看作为插入成功的线程,相应地,若一个线程的插入结果为插入失败,则该线程可以看作为插入失败的线程,因此本发明实施例中,可以根据插入结果,将至少一个线程分为插入成功的线程和插入失败的线程。
具体地,可以利用插入结果的返回值代表线程是否插入成功,比如,如果线程A1向共享锁表D中插入特定数据,返回值为1,则说明线程A1向共享锁表中插入特定数据D成功,如果线程A2向共享锁表D中插入特定数据,但是返回DuplicateKeyException,则表示异常,说明线程A2向共享锁表中插入特定数据D失败。还有,本发明实施例中,至少一个线程向共享锁表中插入特定数据,得到的返回值也可以代表线程插入数据的顺序,先插入数据的线程对应的返回值为1,后插入数据的线程对应的返回值为DuplicateKeyException。
图2是根据本发明实施例的线程向共享锁表中插入特定数据的示意图。线程1至线程4向同一数据资源请求访问,设置该数据资源的主键为唯一索引,因此从图2可以看出,线程1至线程4对应的唯一索引是相同的,且利用该唯一索引向共享锁表中插入数据。图2中,线程3成功向共享锁表中插入数据,对应的返回值为1,而线程1、2和4插入数据失败,对应的返回值为DuplicateKeyException,那么线程1、2和4为插入失败的线程,线程3为插入成功的线程。
本发明实施例中,至少一个线程发送访问数据资源的请求,且该数据资源在同一时间仅可以被一个线程访问,因此至少一个线程可以基于唯一索引特性,向数据资源对应的共享锁表插入特定数据,确定插入成功的线程为可以访问数据资源的线程。本发明的可参考实施例中,特定数据可以包括:数据资源对应的唯一索引和属性数据。其中,数据资源对应的唯一索引已经解释过,可以为数据资源的一个数据特征,也可以为数据资源的多个数据特征的组合;属性数据是指数据资源的数据特别,可以包括特定数据的唯一标识、特定数据的创建时间和特定数据的更新时间这些选项中至少一项。特定数据的唯一标识可以是数据资源的主键,也可以是递增序列,代表该数据资源被访问的次数,因此在唯一标识为递增序列的情况下,可以通过该唯一标识获取到该数据资源的并发请求量,在并发请求量过高的情况下,可以预先向线程发送提醒消息,在这种情况下,如果一个线程在该时间不是必须访问该数据资源,那么可以其他时间请求访问该数据资源。特定数据的创建时间可以是指线程访问该数据资源的时间,数据资源的更新时间可以是指线程对该数据资源的更新时间。
由于线程向共享锁表中插入特定数据,且特定数据可以包括数据资源对应的唯一索引和属性数据,因此创建的共享锁表中可以包括数据资源对应的唯一索引、唯一标识、创建时间以及更新时间这些字段。需要注意的是,唯一索引为必选字段,唯一标识、创建时间以及更新时间为可选字段。线程向共享锁表中插入特定数据时,可以利用唯一索引限制插入成功的线程数,并发操作时,第一条插入语句会执行成功,返回值为1,第一条插入语句对应的线程为插入成功的线程,其他的插入操作都会执行失败,可以抛出DuplicateKeyException异常。
不同的线程插入特定数据后的插入结果是不同的,即返回值是不同的,根据返回值,就可以判断当前线程是否可以访问数据资源,或者是可以判断当前线程是否拿到了分布式操作锁。如果返回值为1,则说明当前线程可以访问数据资源,可以认为当前线程获得分布式操作锁,就可以对数据资源进行操作,操作完成后,需要删除共享锁表中插入的特定数据,从而可以释放锁,其他的线程可以获取到该分布式操作锁,即可以线程才可以访问该数据资源。如果返回值为DuplicateK eyException,那么需要捕获异常,然后在调用插入操作。
图3是根据本发明实施例的实现分布式锁的示意图。从图3可以看出,为了解决数据库宕机的问题,可以设置主库和从库,在主库出现宕机的情况下,可以利用从库进行执行操作。图3中,线程1至线程4通过唯一索引,并发向主库中的数据资源对应的共享锁表插入数据,线程1、2和4对应的返回结果为抛出DuplicateKeyException异常,线程3对应的返回结果为1,因此可以认为线程3拿到了分布式操作锁,可以对数据资源进行访问,而线程1、2和4需要等待,可以再调用插入数据操作。
本发明的可参考实施例中,在确定插入成功的线程为访问数据资源的线程之后,实现分布式锁的方法还可以包括:在插入成功的线程访问数据资源后,从共享锁表中删除插入成功的线程对应的特定数据。比如,图3中的线程3成功输入数据后,可以访问数据资源,并利用数据资源进行业务上的操作,在线程3操作完成后,需要将插入在共享锁表中的特定数据删除,这样其他线程才可以利用该数据资源对应的唯一索引向共享锁表成功插入特定数据。也就是说,针对相同的唯一索引,在共享锁表中最多有一条该唯一索引对应的特定数据,这样就解决了数据资源在同一时间仅被一个线程访问,实现分布式锁。本方案实施例中,可以根据唯一索引从共享锁表中删除特定数据,也可以根据特定数据的唯一标识或特定数据的创建时间,从共享锁表中删除特定数据。
本发明的可参考实施例中,实现分布式锁的方法还可以包括:判断是否成功从共享锁表中删除插入成功的线程对应的特定数据,若否,则利用异步线程删除插入成功的线程对应的特定数据。
为了确保锁资源能够正确释放,即为了确保数据资源可以被正常访问,避免死锁,必须保证锁释放成功,因此需要判断是否成功从共享锁表中删除插入成功的线程对应的特定数据。若删除失败,表示主流程已经完成,只是释放锁失败,此时主流程可以正常结束,需要单独开启一个异步线程,利用该异步线程删除插入成功的线程对应的特定数据,不停轮询删除,直到删除完成为止,则锁释放完成。
插入成功的线程可以获得分布式操作锁,访问请求的数据资源。对于插入失败的线程,需要捕获异常,然后在调用插入操作。因此,本发明的可参考实施例中,在确定插入成功的线程和插入失败的线程之后,实现分布式锁的方法还可以包括:向插入失败的线程返回访问请求失败的结果,接收插入失败的线程返回的再次请求。其中,再次请求为插入失败的线程根据结果和对应的需求,发送的访问数据资源的请求或者对数据资源进行测试的请求。
具体的,若线程A1请求访问数据资源D,并且线程A1向数据资源D对应的共享锁表中插入特定数据失败,那么线程A1可以根据返回的插入失败结果和线程A1的具体需求,再次发送访问数据资源D的请求,或者发送对数据资源D进行测试的请求。
假设说,数据资源D对于线程A1属于紧急需求,也就是说,线程A1只有访问数据资源D之后,才可以执行其他操作,而且需要尽早访问数据资源D,那么线程A1在接收到插入失败结果后,会再次发送访问数据资源D的请求,也就是再次向共享锁表中插入特定数据。
再比如,数据资源D对于线程A1不属于紧急需求,也就是说,线程A1在当前时刻可以不访问数据资源D,那么线程A1在接收到插入失败结果后,可以再次发送访问数据资源D的请求,也就是再次向共享锁表中插入特定数据,也可以在一段时间之后,再次发送访问数据资源D的请求,也就是再次向共享锁表中插入特定数据。
或者是,根据具体情况,设置线程A1可以在预设时间内可以访问数据资源D,也就是线程A1可以在预设时间内向共享锁表插入特定数据成功,那么线程A1可以在预设时间内向共享锁表插入特定数据失败,此种情况下,线程A1可以发送对数据资源D进行测试的请求,测试是否数据资源D出现问题,比如数据库宕机、网络连接等。
可以看出,本发明实施例的实现分布式锁的方法中,对于插入失败的线程,可以结合该线程的实际需求,接收该线程发送的访问数据资源的请求或者对数据资源进行测试的请求,提高本方案的实用性,给用户带来良好体验。
图4是根据本发明实施例的实现分布式锁的方法的主要流程的示意图。如图4所示,实现分布式锁的方法的主要流程可以包括:
步骤S401,接收数据资源的访问请求,获取访问请求对应的至少一个线程和数据资源对应的唯一索引,其中,该唯一索引为数据资源的一个数据特征或者数据资源的多个数据特征的组合;
步骤S402,构建数据资源对应的共享锁表;
步骤S403,基于唯一索引,控制至少一个线程向数据资源对应的共享锁表插入特定数据,其中,特定数据可以包括:数据资源对应的唯一索引和属性数据,属性数据可以包括以下选项中至少一项:特定数据的唯一标识、特定数据的创建时间、以及数据资源的更新时间;
步骤S404,获取至少一个线程中每个线程对应的插入结果,其中,插入结果为插入成功和插入失败;
步骤S405,根据每个线程对应的插入结果,确定插入成功的线程和插入失败的线程,确定插入成功的线程为访问数据资源的线程;
步骤S406,在插入成功的线程访问数据资源后,从共享锁表中删除插入成功的线程对应的特定数据;
步骤S407,判断是否成功从共享锁表中删除插入成功的线程对应的特定数据,若否,则执行步骤S408;
步骤S408,利用异步线程删除插入成功的线程对应的特定数据;
步骤S409,向插入失败的线程返回访问请求失败的结果,接收插入失败的线程返回的再次请求。
本发明实施例的实现分布式锁技术方案,在接收数据资源的访问请求后,获取到访问请求对应的至少一个线程和数据资源对应的唯一索引,至少一个线程可以基于唯一索引向共享锁表中插入数据,且仅有一个线程可以插入成功,代表可以访问数据资源,其他的线程均插入失败,从而可以实现分布式锁,能够避免现有技术的部署较为复杂、以及开发和维护成本较高的技术问题,且通过唯一索引和共享锁表就可以实现分布式锁,操作难度低,用户体验好。
图5是根据本发明实施例的实现分布式锁的装置的主要模块的示意图。如图5所示,实现分布式锁的装置500的主要模块可以包括:获取模块501、插入模块502和确定模块503。
其中,获取模块501可用于接收数据资源的访问请求,获取访问请求对应的至少一个线程和数据资源对应的唯一索引;插入模块502可用于基于唯一索引,控制至少一个线程向数据资源对应的共享锁表插入特定数据;确定模块503可用于获取至少一个线程对应的插入结果,根据插入结果,确定访问数据资源的线程,以实现分布式锁。
本发明实施例中,唯一索引为数据资源的一个数据特征或者数据资源的多个数据特征的组合;以及特定数据可以包括:数据资源对应的唯一索引和属性数据,属性数据可以包括以下选项中至少一项:特定数据的唯一标识、特定数据的创建时间、以及数据资源的更新时间。
本发明实施例中,确定模块503还可用于:获取至少一个线程中每个线程对应的插入结果,插入结果为插入成功和插入失败;根据每个线程对应的插入结果,确定插入成功的线程和插入失败的线程;确定插入成功的线程为访问数据资源的线程。
本发明实施例中,确定模块503还可用于:在插入成功的线程访问数据资源后,从共享锁表中删除插入成功的线程对应的特定数据。
本发明实施例中,实现分布式锁的装置还可以包括:删除模块(图中未示出)。该删除模块可用于:判断是否成功从共享锁表中删除插入成功的线程对应的特定数据,若否,则利用异步线程删除插入成功的线程对应的特定数据。
本发明实施例中,确定模块503还可用于:向插入失败的线程返回访问请求失败的结果,接收插入失败的线程返回的再次请求。其中,再次请求为插入失败的线程根据结果和对应的需求,发送的访问数据资源的请求或者对数据资源进行测试的请求。
本发明实施例中,插入模块502还可用于:构建数据资源对应的共享锁表。
从以上描述可以看出,本发明实施例的实现分布式锁的装置,在接收数据资源的访问请求后,获取到访问请求对应的至少一个线程和数据资源对应的唯一索引,至少一个线程可以基于唯一索引向共享锁表中插入数据,且仅有一个线程可以插入成功,代表可以访问数据资源,其他的线程均插入失败,从而可以实现分布式锁,能够避免现有技术的部署较为复杂、以及开发和维护成本较高的技术问题,且通过唯一索引和共享锁表就可以实现分布式锁,操作难度低,用户体验好。
图6示出了可以应用本发明实施例的实现分布式锁的方法或实现分布式锁的装置的示例性系统架构600。
如图6所示,系统架构600可以包括终端设备601、602、603,网络604和服务器605。网络604用以在终端设备601、602、603和服务器605之间提供通信链路的介质。网络604可以包括各种连接类型,例如有线、无线通信链路或者光纤电缆等等。
用户可以使用终端设备601、602、603通过网络604与服务器605交互,以接收或发送消息等。终端设备601、602、603上可以安装有各种通讯客户端应用,例如购物类应用、网页浏览器应用、搜索类应用、即时通信工具、邮箱客户端、社交平台软件等(仅为示例)。
终端设备601、602、603可以是具有显示屏并且支持网页浏览的各种电子设备,包括但不限于智能手机、平板电脑、膝上型便携计算机和台式计算机等等。
服务器605可以是提供各种服务的服务器,例如对用户利用终端设备601、602、603所浏览的购物类网站提供支持的后台管理服务器(仅为示例)。后台管理服务器可以对接收到的产品信息查询请求等数据进行分析等处理,并将处理结果(例如目标推送信息、产品信息--仅为示例)反馈给终端设备。
需要说明的是,本发明实施例所提供的实现分布式锁的方法一般由服务器605执行,相应地,实现分布式锁的装置一般设置于服务器605中。
应该理解,图6中的终端设备、网络和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。
下面参考图7,其示出了适于用来实现本发明实施例的终端设备的计算机系统700的结构示意图。图7示出的终端设备仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
如图7所示,计算机系统700包括中央处理单元(CPU)701,其可以根据存储在只读存储器(ROM)702中的程序或者从存储部分708加载到随机访问存储器(RAM)703中的程序而执行各种适当的动作和处理。在RAM 703中,还存储有系统700操作所需的各种程序和数据。CPU 701、ROM 702以及RAM 703通过总线704彼此相连。输入/输出(I/O)接口705也连接至总线704。
以下部件连接至I/O接口705:包括键盘、鼠标等的输入部分706;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分707;包括硬盘等的存储部分708;以及包括诸如LAN卡、调制解调器等的网络接口卡的通信部分709。通信部分709经由诸如因特网的网络执行通信处理。驱动器710也根据需要连接至I/O接口705。可拆卸介质711,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器710上,以便于从其上读出的计算机程序根据需要被安装入存储部分708。
特别地,根据本发明公开的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本发明公开的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分709从网络上被下载和安装,和/或从可拆卸介质711被安装。在该计算机程序被中央处理单元(CPU)701执行时,执行本发明的系统中限定的上述功能。
需要说明的是,本发明所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本发明中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。而在本发明中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、RF等等,或者上述的任意合适的组合。
附图中的流程图和框图,图示了按照本发明各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
描述于本发明实施例中所涉及到的模块可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的模块也可以设置在处理器中,例如,可以描述为:一种处理器包括获取模块、插入模块和确定模块。其中,这些模块的名称在某种情况下并不构成对该模块本身的限定,例如,获取模块还可以被描述为“接收数据资源的访问请求,获取访问请求对应的至少一个线程和数据资源对应的唯一索引的模块”。
作为另一方面,本发明还提供了一种计算机可读介质,该计算机可读介质可以是上述实施例中描述的设备中所包含的;也可以是单独存在,而未装配入该设备中。上述计算机可读介质承载有一个或者多个程序,当上述一个或者多个程序被一个该设备执行时,使得该设备包括:接收数据资源的访问请求,获取访问请求对应的至少一个线程和数据资源对应的唯一索引;基于唯一索引,控制至少一个线程向数据资源对应的共享锁表插入特定数据;获取至少一个线程对应的插入结果,根据插入结果,确定访问数据资源的线程,以实现分布式锁。
根据本发明实施例的技术方案,在接收数据资源的访问请求后,获取到访问请求对应的至少一个线程和数据资源对应的唯一索引,至少一个线程可以基于唯一索引向共享锁表中插入数据,且仅有一个线程可以插入成功,代表可以访问数据资源,其他的线程均插入失败,从而可以实现分布式锁,能够避免现有技术的部署较为复杂、以及开发和维护成本较高的技术问题,且通过唯一索引和共享锁表就可以实现分布式锁,操作难度低,用户体验好。
上述具体实施方式,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种各样的修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。
Claims (10)
1.一种实现分布式锁的方法,其特征在于,包括:
接收数据资源的访问请求,获取所述访问请求对应的至少一个线程和所述数据资源对应的唯一索引;
基于所述唯一索引,控制所述至少一个线程向所述数据资源对应的共享锁表插入特定数据;
获取所述至少一个线程对应的插入结果,根据所述插入结果,确定访问所述数据资源的线程,以实现分布式锁。
2.根据权利要求1所述的方法,其特征在于,所述获取所述至少一个线程对应的插入结果,根据所述插入结果,确定访问所述数据资源的线程,包括:
获取所述至少一个线程中每个线程对应的插入结果,所述插入结果为插入成功和插入失败;
根据所述每个线程对应的插入结果,确定插入成功的线程和插入失败的线程;
确定所述插入成功的线程为访问所述数据资源的线程。
3.根据权利要求2所述的方法,其特征在于,在确定所述插入成功的线程为访问所述数据资源的线程之后,所述方法还包括:
在所述插入成功的线程访问所述数据资源后,从所述共享锁表中删除所述插入成功的线程对应的特定数据。
4.根据权利要求3所述的方法,其特征在于,所述方法还包括:
判断是否成功从所述共享锁表中删除所述插入成功的线程对应的特定数据,若否,则利用异步线程删除所述插入成功的线程对应的特定数据。
5.根据权利要求2所述的方法,其特征在于,在确定插入成功的线程和插入失败的线程之后,所述方法还包括:
向所述插入失败的线程返回访问请求失败的结果,接收所述插入失败的线程返回的再次请求;其中,
所述再次请求为所述插入失败的线程根据所述结果和对应的需求,发送的访问所述数据资源的请求或者对所述数据资源进行测试的请求。
6.根据权利要求1所述的方法,其特征在于,在控制所述至少一个线程向所述数据资源对应的共享锁表插入特定数据之前,所述方法还包括:
构建所述数据资源对应的共享锁表。
7.根据权利要求1所述的方法,其特征在于,所述唯一索引为所述数据资源的一个数据特征或者所述数据资源的多个数据特征的组合;以及
所述特定数据包括:所述数据资源对应的唯一索引和属性数据,所述属性数据包括以下选项中至少一项:所述特定数据的唯一标识、所述特定数据的创建时间、以及所述数据资源的更新时间。
8.一种实现分布式锁的装置,其特征在于,包括:
获取模块,用于接收数据资源的访问请求,获取所述访问请求对应的至少一个线程和所述数据资源对应的唯一索引;
插入模块,用于基于所述唯一索引,控制所述至少一个线程向所述数据资源对应的共享锁表插入特定数据;
确定模块,用于获取所述至少一个线程对应的插入结果,根据所述插入结果,确定访问所述数据资源的线程,以实现分布式锁。
9.一种电子设备,其特征在于,包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序,
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如权利要求1-7中任一所述的方法。
10.一种计算机可读介质,其上存储有计算机程序,其特征在于,所述程序被处理器执行时实现如权利要求1-7中任一所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010603579.6A CN113760841A (zh) | 2020-06-29 | 2020-06-29 | 实现分布式锁的方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010603579.6A CN113760841A (zh) | 2020-06-29 | 2020-06-29 | 实现分布式锁的方法和装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113760841A true CN113760841A (zh) | 2021-12-07 |
Family
ID=78785451
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010603579.6A Pending CN113760841A (zh) | 2020-06-29 | 2020-06-29 | 实现分布式锁的方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113760841A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117742979A (zh) * | 2024-02-18 | 2024-03-22 | 中国电子科技集团公司第十五研究所 | 一种面向时空数据处理的分布式锁方法及电子设备 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6625601B1 (en) * | 1999-01-07 | 2003-09-23 | Compaq Information Technologies Group, L.P. | Escrow-locking multithreaded process-pair resource manager dictionary |
US20060212573A1 (en) * | 2003-05-09 | 2006-09-21 | Oracle International Corporation | Efficient locking of shared data that is accessed for reads in a cluster database |
CN101800763A (zh) * | 2009-02-05 | 2010-08-11 | 威睿公司 | 使用网络和基于碟片上的方案的混合锁定 |
US20140089346A1 (en) * | 2012-09-26 | 2014-03-27 | Oracle International Corporation | Methods and apparatus for implementing semi-distributed lock management |
US9471400B1 (en) * | 2015-07-28 | 2016-10-18 | International Business Machines Corporation | Reentrant read-write lock algorithm |
CN110430258A (zh) * | 2019-08-01 | 2019-11-08 | 哈尔滨哈工大大数据通用技术有限公司 | 一种分布式锁管理方法和装置 |
-
2020
- 2020-06-29 CN CN202010603579.6A patent/CN113760841A/zh active Pending
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6625601B1 (en) * | 1999-01-07 | 2003-09-23 | Compaq Information Technologies Group, L.P. | Escrow-locking multithreaded process-pair resource manager dictionary |
US20060212573A1 (en) * | 2003-05-09 | 2006-09-21 | Oracle International Corporation | Efficient locking of shared data that is accessed for reads in a cluster database |
CN101800763A (zh) * | 2009-02-05 | 2010-08-11 | 威睿公司 | 使用网络和基于碟片上的方案的混合锁定 |
US20140089346A1 (en) * | 2012-09-26 | 2014-03-27 | Oracle International Corporation | Methods and apparatus for implementing semi-distributed lock management |
US9471400B1 (en) * | 2015-07-28 | 2016-10-18 | International Business Machines Corporation | Reentrant read-write lock algorithm |
CN110430258A (zh) * | 2019-08-01 | 2019-11-08 | 哈尔滨哈工大大数据通用技术有限公司 | 一种分布式锁管理方法和装置 |
Non-Patent Citations (3)
Title |
---|
刘芬;王芳;田昊;: "基于Zookeeper的分布式锁服务及性能优化", 计算机研究与发展, no. 1, 15 December 2014 (2014-12-15) * |
张一品;: "数据库并发控制中死锁解除的实现方法", 福建电脑, no. 07, 25 July 2006 (2006-07-25) * |
王立;王倩;马朝东;: "基于池化技术的资源复制方案的设计与实现", 计算机科学, no. 3, 15 November 2012 (2012-11-15) * |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117742979A (zh) * | 2024-02-18 | 2024-03-22 | 中国电子科技集团公司第十五研究所 | 一种面向时空数据处理的分布式锁方法及电子设备 |
CN117742979B (zh) * | 2024-02-18 | 2024-04-23 | 中国电子科技集团公司第十五研究所 | 一种面向时空数据处理的分布式锁方法及电子设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
AU2017253679B2 (en) | Providing access to a hybrid application offline | |
EP3791284A1 (en) | Conflict resolution for multi-master distributed databases | |
US20100332531A1 (en) | Batched Transfer of Arbitrarily Distributed Data | |
US20140195514A1 (en) | Unified interface for querying data in legacy databases and current databases | |
CN108874558A (zh) | 分布式事务的消息订阅方法、电子装置及可读存储介质 | |
US20160179789A1 (en) | Content localization using fallback translations | |
CN109032796B (zh) | 一种数据处理方法和装置 | |
CN110909022A (zh) | 一种数据查询方法和装置 | |
CN111126948A (zh) | 用于审批流程的处理方法和装置 | |
CN113760841A (zh) | 实现分布式锁的方法和装置 | |
CN113361236A (zh) | 一种编辑文档的方法和装置 | |
US11113339B2 (en) | System and method for federated content management using a federated library and federated metadata propagation | |
CN112579615A (zh) | 一种实现分布式锁的方法和装置 | |
CN116974983A (zh) | 数据处理方法、装置、计算机可读介质及电子设备 | |
US11580128B2 (en) | Preventing DBMS deadlock by eliminating shared locking | |
US11157454B2 (en) | Event-based synchronization in a file sharing environment | |
CN113722007A (zh) | Vpn分支设备的配置方法、装置及系统 | |
US10803021B2 (en) | Dynamic reprioritization of content download during synchronization | |
US20170091253A1 (en) | Interrupted synchronization detection and recovery | |
CN113760861A (zh) | 一种数据迁移的方法和装置 | |
CN113742321A (zh) | 一种数据更新的方法和装置 | |
US10185759B2 (en) | Distinguishing event type | |
CN111984686A (zh) | 一种数据处理的方法和装置 | |
CN113760860B (zh) | 一种数据读取方法和装置 | |
US9961132B2 (en) | Placing a user account in escrow |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |