介绍
分布式锁,即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资源访问的问题,而分布式锁,就是解决了分布式系统中控制共享资源访问的问题。与单体应用不同的是,分布式系统中竞争共享资源的最小粒度从线程升级成了进程。
目前比较常见的实现分布式锁的方式主要有三种:基于数据库实现、基于Zookeeper实现、基于redis实现。本文主要介绍了一种基于mysql数据库实现分布式锁的方式,从最简单的实现方式开始,一步步构造一个拥有基本分布式锁条件的程序。
版本1
mysql有两种实现分布式锁的思路,乐观锁和悲观锁,本文利用悲观锁方式实现。
select * from tableName where key = " " for update
在InnoDB下如果key为索引,则会为该行加上排他锁,若其它线程想获得排他锁则会阻塞。
伪代码:
where(true){
select ... for update
if(记录存在)
//业务逻辑
return;
else
inset ...
}
commit;
如上的版本会产生两个问题:
- insert时通过唯一键重复报错,处理错误形式不和
- 由于间隙锁原因,并发插入会引发死锁
版本2
为了解决上一版本的问题,本文引入中央锁的概念,也同时加入了数据库锁表和状态位。
- 创建数据库锁表,插入中央锁记录
-- 锁表,单库单表 CREATE TABLE IF NOT EXISTS credit_card_user_tag_db.t_tag_lock ( -- 记录index Findex INT NOT NULL AUTO_INCREMENT COMMENT '自增索引id', -- 锁信息(key、计数器、过期时间、记录描述) Flock_name VARCH

文章介绍了如何使用MySQL实现分布式锁,从最初的简单悲观锁方案,到引入中央锁和状态位,再到通过哈希值分散锁的策略,以及最后加入请求ID和超时解锁机制,逐步优化并发性能和解决锁问题。

548

被折叠的 条评论
为什么被折叠?



