当前位置:网站首页>基于数据库实现分布式锁
基于数据库实现分布式锁
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)
- 四平方和,激光炸弹
- 如何确定异步 I/O 瓶颈
- 【历史上的今天】8 月 4 日:第一位图灵奖女性得主;NVIDIA 收购 MediaQ;首届网络安全挑战大赛完成
- 1375. 二进制字符串前缀一致的次数-前序遍历法
- leetcode:250. 统计同值子树
- Keycloak 6.0.0 正式发布,身份和访问管理系统
- 属于程序猿的浪漫
- Technology sharing | Description of the electronic fence function in the integrated dispatching system
猜你喜欢

leetcode:255 验证前序遍历序列二叉搜索树

JCMsuite应用:倾斜平面波传播透过光阑的传输

Crawler - basic use of selenium, no interface browser, other uses of selenium, cookies of selenium, crawler cases

The Internet of things application development trend

Rust 从入门到精通04-变量

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

世间几乎所有已知蛋白质结构,都被DeepMind开源了

Problem solving-->Online OJ (18)

leetcode:241. 为运算表达式设计优先级

快解析结合友加畅捷U+
随机推荐
B.构造一个简单的数列(贪心)
Qt的QItemDelegate使用
Find My技术|防止你的宠物跑丢,苹果Find My技术可以帮到你
JCMsuite应用:倾斜平面波传播透过光阑的传输
The Internet of things application development trend
metaRTC5.0新版本支持mbedtls(PolarSSL)
【剑指offer33】二叉搜索树的后序遍历序列
异步编程概览
我爱七夕哈哈哈
职场漫谈:为什么越是内卷的行业越有人争着抢着往里冲?好奇怪的说...
砺夏行动|九州云章津楠:开源不是少数人的运动,大众化才是源泉
ACL 2022 | 社会科学理论驱动的言论建模
1403. 非递增顺序的最小子序列
用了TCP协议,就一定不会丢包吗?
快解析结合友加畅捷U+
C# 动态加载卸载 DLL
Database recovery
Rust from entry to proficient 04-variables
浙江大学团队使用基于知识图谱的新方法,从空间分辨转录组数据中推断细胞间通信状况
开发者独立搭建一个跨模态搜索应用有多难?