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

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

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

update goods set goods_num = goods_num -1,version =查询的version值自增 where goods_name ="小本子" and version=查询出来的version; 

着实,借助更新时刻戳(updated_at)也可以实现乐观锁,和回收 version 字段的方法相似。

更新操纵执行前列获取记录当前的更新时刻,在提交更新时,检测当前更新时刻是否与更新开始时获取的更新时刻戳相称。

气馁锁

除了可以通过增删操纵数据库表中的记录以外,我们还可以借助数据库中自带的锁来实现漫衍式锁。

在查询语句后头增进 FOR UPDATE,数据库会在查询进程中给数据库表增进气馁锁,也称排他锁。当某笔记录被加上气馁锁之后,其余线程也就无法再转业上增进气馁锁。

气馁锁,与乐观锁相反,老是假设最坏的环境,它以为数据的更新在大大都环境下是会发生斗嘴的。

在行使气馁锁的同时,我们必要留意一下锁的级别。MySQL InnoDB 引起在加锁的时辰,只有明晰地指定主键(或索引)的才会执行行锁 (只锁住被选取的数据),不然 MySQL 将会执行表锁(将整个数据表单给锁住)。

在行使气馁锁时,我们必需封锁 MySQL 数据库的自动提交属性(参考下面的示例),由于 MySQL 默认行使 autocommit 模式。

也就是说,当你执行一个更新操纵后,MySQL 会立即将功效举办提交。

mysql> SET AUTOCOMMIT = 0; 

Query OK, 0 rows affected (0.00 sec) 

这样在行使 FOR UPDATE 得到锁之后可以执行响应的营业逻辑,执行完之后再行使 COMMIT 来开释锁。

我们不妨相沿前面的 database_lock 表来详细表述一下用法。假设有一线程A必要得到锁并执行响应的操纵。

那么它的详细步调如下:

STEP1 - 获取锁:SELECT * FROM database_lock WHERE id = 1 FOR UPDATE;。 

STEP2 - 执行营业逻辑。 

STEP3 - 开释锁:COMMIT。 

作者:凌晶

(编辑:湖南网)

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

热点阅读