一种基于数据库实现分布式锁的方法技术

技术编号:27108122 阅读:12 留言:0更新日期:2021-01-25 19:00
本发明专利技术公开了一种基于数据库实现分布式锁的方法,包括以下步骤:S1、查询数据库,在数据库表格中查询是否存在分布式锁;S2、如果数据库不存在分布式锁,则建立一个分布式锁的表格,同时添加分布式锁的执行sql语句,在进行任务操作时,将带有分布式锁的方法当做参数带入任务的方法执行方法操作,如果数据库存在分布式锁,则不建立;S3、添加事务日志;本方法实现的分布式锁不过分依赖中间件,利用分布式锁调用方法,类似调用接口的使用,使得本方法具备快速移植能力,同时,可以适用于不同类型的关系型数据库运行,利用事务日志和定时任务及时清理缓存和解锁,减少占用资源,不存在引起数据库资源使用过高的风险。据库资源使用过高的风险。据库资源使用过高的风险。

【技术实现步骤摘要】
一种基于数据库实现分布式锁的方法


[0001]本专利技术涉及分布式锁
,具体为一种基于数据库实现分布式锁的方法。

技术介绍

[0002]众所周知,为了保证一个方法在高并发情况下的同一时间只能被同一个线程执行,在传统单体应用单机部署的情况下,可以使用Java并发处理相关的API(如ReentrantLcok或synchronized)进行互斥控制。但是,随着业务发展的需要,原单体单机部署的系统被演化成分布式系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,为了解决这个问题就需要一种跨JVM的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题,现有的分布式锁分依赖中间件,不具备快速移植能力,导致程序运行缓慢,同时,实现方式复杂,代码繁琐,需要多个层级之间相互调用,时间消耗较大,对内存运行造成极大的压力,为此,提出一种基于数据库实现分布式锁的方法。

技术实现思路

[0003](一)解决的技术问题
[0004]针对现有技术的不足,本专利技术提供了一种基于数据库实现分布式锁的方法。
[0005](二)技术方案
[0006]为实现上述目的,本专利技术提供如下技术方案:一种基于数据库实现分布式锁的方法,包括以下步骤:
[0007]S1、查询数据库,在数据库表格中查询是否存在分布式锁;
[0008]S2、如果数据库不存在分布式锁,则建立一个分布式锁的表格,同时添加分布式锁的执行sql语句,在进行任务操作时,将带有分布式锁的方法当做参数带入任务的方法执行方法操作,如果数据库存在分布式锁,则不建立;
[0009]S3、添加事务日志,在操作过程中调用事务方法,及时记录操作步骤,增加网络安全性和任务执行的监控;
[0010]S4、当线程执行完这个方法后,需要释放锁,即编写删除语句,将带有执行分布式锁编号的数据删除,从而将锁释放;
[0011]S5、添加定时任务,定时清理线程缓存,避免解锁失败导致其他线程一直无法获取分布式锁。
[0012]优选的,在所述S2中,所述分布式锁的表格应至少包含主键、锁定的方法名称、锁定的信息和编号等基本字段,其中,主键、锁定的方法名称要添加唯一性约束,一个方法只能存在一条记录,如果有多条请求同时提交,最终也只会生效一条,即操作成功的那个线程即获得了该方法的锁。
[0013]在前述方案的基础上,在所述S1中,所述数据库可以为MySql、Redis或Zookeeper等常用数据库。
[0014]在前述方案的基础上,在所述S2中,如果数据库存在分布式锁,则判断已存在的分布式锁心跳是否正常,如果心跳正常,说明锁被其他拥有者占用,则直接退出处理,如果锁刷新超时,心跳失常,则更新锁拥有者ID、锁状态、锁维护时间,同时刷新内存中分布式锁信息,然后开始具体任务处理。
[0015]进一步的,在所述S2中,调用分布式锁执行方法时,在方法外围添加for循环或while循环之类循环方法,直至INSERT成功再返回。
[0016]进一步的,在所述S3中,在事务日志触发后,分布式锁状态刷新后台线程,轮询获取待刷新分布式锁队列中的锁对象,检查锁状态,如果状态为待解除,则删除数据库中相应的锁记录,如果锁状态正常,则更新数据库中锁维护时间,同时刷新内存中锁的心跳时间,以维持锁的继续使用。
[0017]进一步的,在所述S4中,在释放锁之后,需添加事务日志,将执行步骤添加记录。
[0018]进一步的,在S5中,操作结束后,调用唤醒的方法,将其他排队的线程唤醒,避免其他线程一直沉睡排队。
[0019](三)有益效果
[0020]与现有技术相比,本专利技术提供了一种基于数据库实现分布式锁的方法,具备以下有益效果:本方法实现的分布式锁不过分依赖中间件,利用分布式锁调用方法,类似调用接口的使用,使得本方法具备快速移植能力,同时,可以适用于不同类型的关系型数据库运行,利用事务日志和定时任务及时清理缓存和解锁,减少占用资源,不存在引起数据库资源使用过高的风险。
附图说明
[0021]图1为本专利技术的方法流程图。
具体实施方式
[0022]下面将结合本专利技术实施例中的附图,对本专利技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本专利技术一部分实施例,而不是全部的实施例。基于本专利技术中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本专利技术保护的范围。
[0023]实施例
[0024]请参阅图1,本专利技术提供一种技术方案:一种基于数据库实现分布式锁的方法,包括以下步骤:
[0025]S1、查询数据库,在数据库表格中查询是否存在分布式锁;
[0026]S2、如果数据库不存在分布式锁,则建立一个分布式锁的表格,同时添加分布式锁的执行sql语句,在进行任务操作时,将带有分布式锁的方法当做参数带入任务的方法执行方法操作,如果数据库存在分布式锁,则不建立;
[0027]S3、添加事务日志,在操作过程中调用事务方法,及时记录操作步骤,增加网络安全性和任务执行的监控;
[0028]S4、当线程执行完这个方法后,需要释放锁,即编写删除语句,将带有执行分布式锁编号的数据删除,从而将锁释放;
[0029]S5、添加定时任务,定时清理线程缓存,避免解锁失败导致其他线程一直无法获取分布式锁。
[0030]本实施例中,具体的:在S2中,分布式锁的表格应至少包含主键、锁定的方法名称、锁定的信息和编号等基本字段,其中,主键、锁定的方法名称要添加唯一性约束,一个方法只能存在一条记录,如果有多条请求同时提交,最终也只会生效一条,即操作成功的那个线程即获得了该方法的锁;将主键、锁定的方法名称要添加唯一性约束,可以确保数据的唯一性,避免出现具有冲突和带有歧义的数据,使得每条数据都是一条完整独立的数据。
[0031]本实施例中,具体的:在S1中,数据库可以为MySql、Redis或Zookeeper等常用数据库;MySQL是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS应用软件之一,Redis用于存放缓存数据,一些常用的热点信息存放在redis里面的话,就不需要去数据库中获取了,可以提高程序的运行效率,减少数据库的查找,提高代码的运行效率,但是,数据是临时的,不能直接改变数据库内部的内容,需要进行数据的转换才能最终更改数据库的内部,ZooKeeper跟Chubby一样用来存放一些相互协作的信息(Coordination),这些信息比较小一般不会超过1M,在zookeeper中是以一种hierarchicaltree的形式来存放,这些具体的Key/Value信息就store在treenode中,当有事件导致node数据,例如:变更,增加,删除时,Zookeeper就会调用triggerWatch方法,判断当前的path来是否有对应的监听者(watcher),如果有watc本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于数据库实现分布式锁的方法,其特征在于:包括以下步骤:S1、查询数据库,在数据库表格中查询是否存在分布式锁;S2、如果数据库不存在分布式锁,则建立一个分布式锁的表格,同时添加分布式锁的执行sql语句,在进行任务操作时,将带有分布式锁的方法当做参数带入任务的方法执行方法操作,如果数据库存在分布式锁,则不建立;S3、添加事务日志,在操作过程中调用事务方法,及时记录操作步骤,增加网络安全性和任务执行的监控;S4、当线程执行完这个方法后,需要释放锁,即编写删除语句,将带有执行分布式锁编号的数据删除,从而将锁释放;S5、添加定时任务,定时清理线程缓存,避免解锁失败导致其他线程一直无法获取分布式锁。2.根据权利要求1所述的一种基于数据库实现分布式锁的方法,其特征在于:在所述S2中,所述分布式锁的表格应至少包含主键、锁定的方法名称、锁定的信息和编号等基本字段,其中,主键、锁定的方法名称要添加唯一性约束,一个方法只能存在一条记录,如果有多条请求同时提交,最终也只会生效一条,即操作成功的那个线程即获得了该方法的锁。3.根据权利要求1所述的一种基于数据库实现分布式锁的方法,其特征在于:在所述S1中,所述数据库可以为MySql、Redis或Zookeeper等常用数据库。4.根据权利要求1所述...

【专利技术属性】
技术研发人员:汤利君文新林长芝罗路
申请(专利权)人:衡阳云汇科技有限公司
类型:发明
国别省市:

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

1