一 概述
分布式锁可以分为共享锁和排他锁。
二 分布式锁之共享锁
????????共享锁(Shared Locks),又被称作为读锁,当某事务T1对某一数据对象D1加上共享锁,那么当前事务只能对D1进行读取操作,同时其他事务也只能对这个数据对象加上共享锁,直到该数据对象上的所有共享锁都被释放了。
三 分布式锁之排他锁
????????排他锁(Exclusive Locks),又被称作写锁和排他锁,如果事务T1对数据对象D1加上排他锁之后,那么在该数据被加锁的期间,只允许事务T1对数据对象D1进行读取和更新操作,其他任何事务都不能进行读写操作。
四 zookeeper实现排他锁
????????当我们利用zookeeper实现排他锁的时候,我们可以借助它同级节点的唯一性,在需要获取排他锁的时候,所有的客户端都会试图通过调用create方法,在某个节点a下创建临时子节点b,最终只有一个客户端能够被创建成功,创建成功的客户端就会获得分布式锁。于此同时,所有没有获取到锁的客户端可以在节点a上注册一个子节点变更的watcher监听事件,以便重新争取获得锁。
五 zookeeper获取排他锁的实现方式
? ? ? ? 实际开发中我们可以使用curator工具包封装的API帮助我们实现分布式锁。
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.0</version>
</dependency>
? ? ? ??curator中的几种锁方案:
- ?InterProcessMutex:分布式可重入排它锁
- ?InterProcessSemaphoreMutex:分布式排它锁
- ?InterProcessReadWriteLock:分布式读写锁
? ? ? ? zookeeper实现分布式锁的过程
????????1. 客户端调用create方法创建类似定义锁方式的临时顺序节点
????????
? ? ? ? ?2. 客户端调用getChildren接口来获取所有已创建的子节点列表。
? ? ? ? ?3. 判断是否获取锁,对于读操作请求,如果所有比自己小的子节点都是读请求或者没有比自己序号小的子节点,表明已经成功获取共享锁,同时开始执行逻辑。而对于写请求,当我们自己不是序号最小的子节点,那么就进入等待。
? ? ? ? ?4. 如果没有获取共享锁,读请求向比自己序号小的最后一个写请求节点注册watcher监听,而写请求向比自己序号小的左后一个节点注册watcher监听。
|