一种基于mysql实现分布式锁的方式

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

介绍

分布式锁,即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资源访问的问题,而分布式锁,就是解决了分布式系统中控制共享资源访问的问题。与单体应用不同的是,分布式系统中竞争共享资源的最小粒度从线程升级成了进程。

目前比较常见的实现分布式锁的方式主要有三种:基于数据库实现、基于Zookeeper实现、基于redis实现。本文主要介绍了一种基于mysql数据库实现分布式锁的方式,从最简单的实现方式开始,一步步构造一个拥有基本分布式锁条件的程序。

版本1

mysql有两种实现分布式锁的思路,乐观锁和悲观锁,本文利用悲观锁方式实现。

select * from tableName where key = " " for update

在InnoDB下如果key为索引,则会为该行加上排他锁,若其它线程想获得排他锁则会阻塞。
伪代码:

where(true){
	select ... for update
	if(记录存在)
		//业务逻辑
		return;
	else
		inset ...
}
commit;

如上的版本会产生两个问题:

  1. insert时通过唯一键重复报错,处理错误形式不和
  2. 由于间隙锁原因,并发插入会引发死锁

版本2

为了解决上一版本的问题,本文引入中央锁的概念,也同时加入了数据库锁表和状态位。

  1. 创建数据库锁表,插入中央锁记录
    -- 锁表,单库单表
    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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值