为什么Zookeeper天生就是一副分布式锁的胚子?
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。 作者:凌晶 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |