当前位置:网站首页>基于数据库实现分布式锁
基于数据库实现分布式锁
2022-08-04 14:31:00 【勤天】
基于数据库的实现方式的核心思想是:在数据库中创建一个表,表中包含方法名等字段,并在方法名字段上创建唯一索引,想要执行某个方法,就使用这个方法名向表中插入数据,成功插入则获取锁,执行完成后删除对应的行数据释放锁。
(1)创建一个表:
DROP TABLE IF EXISTS `method_lock`;
CREATE TABLE `method_lock` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`method_name` varchar(64) NOT NULL COMMENT '锁定的方法名',
`desc` varchar(255) NOT NULL COMMENT '备注信息',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `uidx_method_name` (`method_name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='锁定中的方法';
(2)想要执行某个方法,就使用这个方法名向表中插入数据:
INSERT INTO method_lock (method_name, desc) VALUES ('methodName', '测试的methodName');因为我们对method_name做了唯一性约束,这里如果有多个请求同时提交到数据库的话,数据库会保证只有一个操作可以成功,那么我们就可以认为操作成功的那个线程获得了该方法的锁,可以执行方法体内容。
(3)成功插入则获取锁,执行完成后删除对应的行数据释放锁:
delete from method_lock where method_name ='methodName';注意:这只是使用基于数据库的一种方法,使用数据库实现分布式锁还有很多其他的玩法!
使用基于数据库的这种实现方式很简单,但是对于分布式锁应该具备的条件来说,它有一些问题需要解决及优化:
1、因为是基于数据库实现的,数据库的可用性和性能将直接影响分布式锁的可用性及性能,所以,数据库需要双机部署、数据同步、主备切换;
2、不具备可重入的特性,因为同一个线程在释放锁之前,行数据一直存在,无法再次成功插入数据,所以,需要在表中新增一列,用于记录当前获取到锁的机器和线程信息,在再次获取锁的时候,先查询表中机器和线程信息是否和当前机器和线程相同,若相同则直接获取锁;
3、没有锁失效机制,因为有可能出现成功插入数据后,服务器宕机了,对应的数据没有被删除,当服务恢复后一直获取不到锁,所以,需要在表中新增一列,用于记录失效时间,并且需要有定时任务清除这些失效的数据;
4、不具备阻塞锁特性,获取不到锁直接返回失败,所以需要优化获取逻辑,循环多次去获取。
5、在实施的过程中会遇到各种不同的问题,为了解决这些问题,实现方式将会越来越复杂;依赖数据库需要一定的资源开销,性能问题需要考虑。
边栏推荐
- 在腾讯,我的试用期总结!
- G. Mountaineering Squad (violence & dfs)
- How to install postgresql and configure remote access in ubuntu environment
- 1403. 非递增顺序的最小子序列
- 关于redis的几件小事(五)redis保证高并发以及高可用
- Database recovery
- [深入研究4G/5G/6G专题-50]: URLLC-16-《3GPP URLLC相关协议、规范、技术原理深度解读》-10-高可靠性技术-1-低编码率编码调制方案MCS与高可靠性DRB
- Hangzhou electric the competition team arrangement (ACM)
- 特殊品种的二次开户验资金额
- 谷歌插件.crx文件下载后被自动删除的解决方法
猜你喜欢

X射线掠入射聚焦反射镜

考研上岸又转行软件测试,从5k到13k完美逆袭,杭州校区小哥哥拒绝平庸终圆梦!

SLAM 04.视觉里程计-1-相机模型

Find My技术|防止你的宠物跑丢,苹果Find My技术可以帮到你

Cisco-小型网络拓扑(DNS、DHCP、网站服务器、无线路由器)

Sum of four squares, laser bombs

xampp安装包含的组件有(php,perl,apche,mysql)

物联网应用发展趋势

Almost all known protein structures in the world are open sourced by DeepMind

自监督学习未来是掩码自编码器?KAIST最新《自监督学习掩码自编码器》研究进展
随机推荐
物联网应用发展趋势
【北亚数据恢复】IBM System Storage存储lvm信息丢失数据恢复方案
《中国综合算力指数》《中国算力白皮书》《中国存力白皮书》《中国运力白皮书》在首届算力大会上重磅发出
手搓一个“七夕限定”,用3D Engine 5分钟实现烟花绽放效果
阴影初始化【5】
特殊品种的二次开户验资金额
Cisco-小型网络拓扑(DNS、DHCP、网站服务器、无线路由器)
Unity插件:使用PopulationSystem制作行走交流的路人
metaRTC5.0新版本支持mbedtls(PolarSSL)
leetcode:241. 为运算表达式设计优先级
Technology sharing | Mini program realizes audio and video calls
eyb:JWT介绍
Crawler - basic use of selenium, no interface browser, other uses of selenium, cookies of selenium, crawler cases
蓝牙技术|上半年全国新增 130 万台充电桩,蓝牙充电桩将成为市场主流
利用决策树找出最优特征组合
AOSP内置APP特许权限白名单
Makefile syntax and usage notes
九州云出席领航者线上论坛,共话5G MEC边缘计算现状、挑战和未来
idea removes spark logs
token 过期后,如何自动续期?