分布式锁

1,

乐观锁的特点先进行业务操作,不到万不得已不去拿锁。即“乐观”的认为拿锁多半是会成功的,因此在进行完业务操作需要实际更新数据的最后一步再去拿一下锁就好。
乐观锁在数据库上的实现完全是逻辑的,不需要数据库提供特殊的支持。一般的做法是在需要锁的数据上增加一个版本号,或者时间戳

 悲观锁 对数据库加锁 select * from order for update

数据库加上版本号 防止用户重复提交转账多次
幂等 一次和多次操作一样 如给一个唯一的订单号 多次点击支付不会有问题 支付成功版本号改为1

2,

zookeeper分布式锁的思路:
进程需要访问共享数据时, 就在"/locks"节点下创建一个sequence类型的子节点, 称为thisPath. 当thisPath在所有子节点中最小时, 说明该进程获得了锁. 进程获得锁之后, 就可以访问共享资源了. 访问完成后, 需要将thisPath删除. 锁由新的最小的子节点获得.
有了清晰的思路之后, 还需要补充一些细节. 进程如何知道thisPath是所有子节点中最小的呢? 可以在创建的时候, 通过getChildren方法获取子节点列表, 然后在列表中找到排名比thisPath前1位的节点, 称为waitPath, 然后在waitPath上注册监听, 当thisPath被删除后, 进程获得通知, 此时说明该进程获得了锁.
例如下面有234 2最小 2进程获得锁,删除后3获得锁

posted @ 2019-04-03 16:17  song123666  阅读(126)  评论(0编辑  收藏  举报