加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

为什么Zookeeper天生就是一副分布式锁的胚子?

发布时间:2020-03-17 07:18:56 所属栏目:编程 来源:站长网
导读:副问题#e# 【金融特辑】光大****科技部DBA女神带你从0到1揭秘MGR 什么是漫衍式锁?漫衍式锁是节制漫衍式体系之间同步会见共享资源的一种方法。在漫衍式体系中,经常必要和谐他们的举措。 图片来自 Pexels 假如差异的体系或是统一个体系的差异主机之间共享了

`description` varchar(1024) NOT NULL DEFAULT "" COMMENT '描写', 

PRIMARY KEY (`id`), 

UNIQUE KEY `uiq_idx_resource` (`resource`) 

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='数据库漫衍式锁表'; 

①得到锁

我们可以插入一条数据:

INSERT INTO database_lock(resource, description) VALUES (1, 'lock'); 

由于表 database_lock 中 resource 是独一索引,以是其他哀求提交到数据库,就会报错,并不会插入乐成,只有一个可以插入。插入乐成,我们就获取到锁。

②删除锁

INSERT INTO database_lock(resource, description) VALUES (1, 'lock'); 

这种实现方法很是的简朴,可是必要留意以下几点:

①这种锁没有失效时刻,一旦开释锁的操纵失败就会导致锁记录一向在数据库中,其他线程无法得到锁。这个缺陷也很好办理,好比可以做一个按时使命去按时整理。

②这种锁的靠得住性依靠于数据库。提议配置备库,停止单点,进一步进步靠得住性。

③这种锁长短阻塞的,由于插入数据失败之后会直接报错,想要得到锁就必要再次操纵。

假如必要阻塞式的,可以弄个 for 轮回、while 轮回之类的,直至 INSERT 乐成再返回。

④这种锁也长短可重入的,由于统一个线程在没有开释锁之前无法再次得到锁,由于数据库中已经存在统一份记录了。

想要实现可重入锁,可以在数据库中添加一些字段,好比得到锁的主机信息、线程信息等。

那么在再次得到锁的时辰可以先查询数据,假如当前的主机信息和线程信息等能被查到的话,可以直接把锁分派给它。

乐观锁

顾名思义,体系以为数据的更新在大大都环境下是不会发生斗嘴的,只在数据库更新操纵提交的时辰才对数据作斗嘴检测。假如检测的功效呈现了与预期数据纷歧致的环境,则返回失败信息。

为什么Zookeeper生成就是一副漫衍式锁的胚子?

乐观锁大大都是基于数据版本(version)的记录机制实现的。何谓数据版本号?

即为数据增进一个版本标识,在基于数据库表的版本办理方案中,一样平常是通过为数据库表添加一个 “version”字段来实现读取出数据时,将此版本号一同读出,之后更新时,对此版本号加 1。

在更新进程中,会对版本号举办较量,假如是同等的,没有产生改变,则会乐成执行本次操纵;假如版本号纷歧致,则会更新失败。

为了更好的领略数据库乐观锁在现实项目中的行使,这里也就举了业界老生常谈的库存例子。

一个电商平台城市存在商品的库存,当用户举办购置的时辰就会对库存举办操纵(库存减 1 代表已经卖出了一件)。

假如只是一个用户举办操纵数据库自己就能担保用户操纵的正确性,而在并发的环境下就会发生一些意想不到的题目。

好比两个用户同时购置一件商品,在数据库层面现实操纵应该是库存举办减 2 操纵。

可是因为高并发的环境,第一个用户购置完成举办数据读取当前库存并举办减 1 操纵,因为这个操纵没有完全执行完成。

第二个用户就进入购置沟通商品,此时查询出的库存也许是未减 1 操纵的库存导致了脏数据的呈现【线程不安详操纵】。

数据库乐观锁也能担保线程安详,凡是代码层面我们城市这样做:

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读