auto commit

This commit is contained in:
CyC2018 2019-11-30 23:19:13 +08:00
parent 0d350f1fb6
commit d3c8e9ae61
2 changed files with 18 additions and 16 deletions

View File

@ -40,12 +40,12 @@
## 数据库的唯一索引 ## 数据库的唯一索引
获得锁时向表中插入一条记录释放锁时删除这条记录唯一索引可以保证该记录只被插入一次那么就可以用这个记录是否存在来判断是否于锁定状态 获得锁时向表中插入一条记录释放锁时删除这条记录唯一索引可以保证该记录只被插入一次那么就可以用这个记录是否存在来判断是否于锁定状态
存在以下几个问题 存在以下几个问题
- 锁没有失效时间解锁失败的话其它进程无法再获得该锁 - 锁没有失效时间解锁失败的话其它进程无法再获得该锁
- 只能是非阻塞锁插入失败直接就报错了无法重试 - 只能是非阻塞锁插入失败直接就报错了无法重试
- 不可重入已经获得锁的进程也必须重新获取锁 - 不可重入已经获得锁的进程也必须重新获取锁
## Redis SETNX 指令 ## Redis SETNX 指令
@ -61,8 +61,8 @@ EXPIRE 指令可以为一个键值对设置一个过期时间,从而避免了
使用了多个 Redis 实例来实现分布式锁这是为了保证在发生单点故障时仍然可用 使用了多个 Redis 实例来实现分布式锁这是为了保证在发生单点故障时仍然可用
- 尝试从 N 个互相独立 Redis 实例获取锁 - 尝试从 N 个互相独立 Redis 实例获取锁
- 计算获取锁消耗的时间只有当这个时间小于锁的过期时间并且从大多数N / 2 + 1实例上获取了锁那么就认为锁获取成功了 - 计算获取锁消耗的时间只有时间小于锁的过期时间并且从大多数N / 2 + 1实例上获取了锁才认为获取锁成功
- 如果获取失败就到每个实例上释放锁 - 如果获取失败就到每个实例上释放锁
## Zookeeper 的有序节点 ## Zookeeper 的有序节点
@ -91,11 +91,11 @@ Zookeeper 提供了一种树形结构的命名空间,/app1/p_1 节点的父节
### 5. 会话超时 ### 5. 会话超时
如果一个已经获得锁的会话超时了因为创建的是临时节点所以该会话对应的临时节点会被删除其它会话就可以获得锁了可以看到Zookeeper 分布式锁不会出现数据库的唯一索引实现的分布式锁释放锁失败问题 如果一个已经获得锁的会话超时了因为创建的是临时节点所以该会话对应的临时节点会被删除其它会话就可以获得锁了可以看到这种实现方式不会出现数据库的唯一索引实现方式释放锁失败的问题
### 6. 羊群效应 ### 6. 羊群效应
一个节点未获得锁只需要监听自己的前一个子节点这是因为如果监听所有的子节点那么任意一个子节点状态改变其它所有子节点都会收到通知羊群效应而我们只希望它的后一个子节点收到通知 一个节点未获得锁只需要监听自己的前一个子节点这是因为如果监听所有的子节点那么任意一个子节点状态改变其它所有子节点都会收到通知羊群效应一只羊动起来其它羊也会一哄而上而我们只希望它的后一个子节点收到通知
# 分布式事务 # 分布式事务
@ -278,6 +278,8 @@ Paxos 协议能够让 Proposer 发送的提议朝着能被大多数 Acceptor 接
Raft 也是分布式一致性协议主要是用来竞选主节点 Raft 也是分布式一致性协议主要是用来竞选主节点
- [Raft: Understandable Distributed Consensus](http://thesecretlivesofdata.com/raft)
## 单个 Candidate 的竞选 ## 单个 Candidate 的竞选
有三种节点FollowerCandidate LeaderLeader 会周期性的发送心跳包给 Follower每个 Follower 都设置了一个随机的竞选超时时间一般为 150ms\~300ms如果在这个时间内没有收到 Leader 的心跳包就会变成 Candidate进入竞选阶段 有三种节点FollowerCandidate LeaderLeader 会周期性的发送心跳包给 Follower每个 Follower 都设置了一个随机的竞选超时时间一般为 150ms\~300ms如果在这个时间内没有收到 Leader 的心跳包就会变成 Candidate进入竞选阶段
@ -332,7 +334,6 @@ Raft 也是分布式一致性协议,主要是用来竞选主节点。
- [Distributed locks with Redis](https://redis.io/topics/distlock) - [Distributed locks with Redis](https://redis.io/topics/distlock)
- [浅谈分布式锁](http://www.linkedkeeper.com/detail/blog.action?bid=1023) - [浅谈分布式锁](http://www.linkedkeeper.com/detail/blog.action?bid=1023)
- [基于 Zookeeper 的分布式锁](http://www.dengshenyu.com/java/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F/2017/10/23/zookeeper-distributed-lock.html) - [基于 Zookeeper 的分布式锁](http://www.dengshenyu.com/java/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F/2017/10/23/zookeeper-distributed-lock.html)
- [Raft: Understandable Distributed Consensus](http://thesecretlivesofdata.com/raft)
- [聊聊分布式事务再说说解决方案](https://www.cnblogs.com/savorboard/p/distributed-system-transaction-consistency.html) - [聊聊分布式事务再说说解决方案](https://www.cnblogs.com/savorboard/p/distributed-system-transaction-consistency.html)
- [分布式系统的事务处理](https://coolshell.cn/articles/10910.html) - [分布式系统的事务处理](https://coolshell.cn/articles/10910.html)
- [深入理解分布式事务](https://juejin.im/entry/577c6f220a2b5800573492be) - [深入理解分布式事务](https://juejin.im/entry/577c6f220a2b5800573492be)

View File

@ -40,12 +40,12 @@
## 数据库的唯一索引 ## 数据库的唯一索引
获得锁时向表中插入一条记录释放锁时删除这条记录唯一索引可以保证该记录只被插入一次那么就可以用这个记录是否存在来判断是否于锁定状态 获得锁时向表中插入一条记录释放锁时删除这条记录唯一索引可以保证该记录只被插入一次那么就可以用这个记录是否存在来判断是否于锁定状态
存在以下几个问题 存在以下几个问题
- 锁没有失效时间解锁失败的话其它进程无法再获得该锁 - 锁没有失效时间解锁失败的话其它进程无法再获得该锁
- 只能是非阻塞锁插入失败直接就报错了无法重试 - 只能是非阻塞锁插入失败直接就报错了无法重试
- 不可重入已经获得锁的进程也必须重新获取锁 - 不可重入已经获得锁的进程也必须重新获取锁
## Redis SETNX 指令 ## Redis SETNX 指令
@ -61,8 +61,8 @@ EXPIRE 指令可以为一个键值对设置一个过期时间,从而避免了
使用了多个 Redis 实例来实现分布式锁这是为了保证在发生单点故障时仍然可用 使用了多个 Redis 实例来实现分布式锁这是为了保证在发生单点故障时仍然可用
- 尝试从 N 个互相独立 Redis 实例获取锁 - 尝试从 N 个互相独立 Redis 实例获取锁
- 计算获取锁消耗的时间只有当这个时间小于锁的过期时间并且从大多数N / 2 + 1实例上获取了锁那么就认为锁获取成功了 - 计算获取锁消耗的时间只有时间小于锁的过期时间并且从大多数N / 2 + 1实例上获取了锁才认为获取锁成功
- 如果获取失败就到每个实例上释放锁 - 如果获取失败就到每个实例上释放锁
## Zookeeper 的有序节点 ## Zookeeper 的有序节点
@ -91,11 +91,11 @@ Zookeeper 提供了一种树形结构的命名空间,/app1/p_1 节点的父节
### 5. 会话超时 ### 5. 会话超时
如果一个已经获得锁的会话超时了因为创建的是临时节点所以该会话对应的临时节点会被删除其它会话就可以获得锁了可以看到Zookeeper 分布式锁不会出现数据库的唯一索引实现的分布式锁释放锁失败问题 如果一个已经获得锁的会话超时了因为创建的是临时节点所以该会话对应的临时节点会被删除其它会话就可以获得锁了可以看到这种实现方式不会出现数据库的唯一索引实现方式释放锁失败的问题
### 6. 羊群效应 ### 6. 羊群效应
一个节点未获得锁只需要监听自己的前一个子节点这是因为如果监听所有的子节点那么任意一个子节点状态改变其它所有子节点都会收到通知羊群效应而我们只希望它的后一个子节点收到通知 一个节点未获得锁只需要监听自己的前一个子节点这是因为如果监听所有的子节点那么任意一个子节点状态改变其它所有子节点都会收到通知羊群效应一只羊动起来其它羊也会一哄而上而我们只希望它的后一个子节点收到通知
# 分布式事务 # 分布式事务
@ -278,6 +278,8 @@ Paxos 协议能够让 Proposer 发送的提议朝着能被大多数 Acceptor 接
Raft 也是分布式一致性协议主要是用来竞选主节点 Raft 也是分布式一致性协议主要是用来竞选主节点
- [Raft: Understandable Distributed Consensus](http://thesecretlivesofdata.com/raft)
## 单个 Candidate 的竞选 ## 单个 Candidate 的竞选
有三种节点FollowerCandidate LeaderLeader 会周期性的发送心跳包给 Follower每个 Follower 都设置了一个随机的竞选超时时间一般为 150ms\~300ms如果在这个时间内没有收到 Leader 的心跳包就会变成 Candidate进入竞选阶段 有三种节点FollowerCandidate LeaderLeader 会周期性的发送心跳包给 Follower每个 Follower 都设置了一个随机的竞选超时时间一般为 150ms\~300ms如果在这个时间内没有收到 Leader 的心跳包就会变成 Candidate进入竞选阶段
@ -332,7 +334,6 @@ Raft 也是分布式一致性协议,主要是用来竞选主节点。
- [Distributed locks with Redis](https://redis.io/topics/distlock) - [Distributed locks with Redis](https://redis.io/topics/distlock)
- [浅谈分布式锁](http://www.linkedkeeper.com/detail/blog.action?bid=1023) - [浅谈分布式锁](http://www.linkedkeeper.com/detail/blog.action?bid=1023)
- [基于 Zookeeper 的分布式锁](http://www.dengshenyu.com/java/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F/2017/10/23/zookeeper-distributed-lock.html) - [基于 Zookeeper 的分布式锁](http://www.dengshenyu.com/java/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F/2017/10/23/zookeeper-distributed-lock.html)
- [Raft: Understandable Distributed Consensus](http://thesecretlivesofdata.com/raft)
- [聊聊分布式事务再说说解决方案](https://www.cnblogs.com/savorboard/p/distributed-system-transaction-consistency.html) - [聊聊分布式事务再说说解决方案](https://www.cnblogs.com/savorboard/p/distributed-system-transaction-consistency.html)
- [分布式系统的事务处理](https://coolshell.cn/articles/10910.html) - [分布式系统的事务处理](https://coolshell.cn/articles/10910.html)
- [深入理解分布式事务](https://juejin.im/entry/577c6f220a2b5800573492be) - [深入理解分布式事务](https://juejin.im/entry/577c6f220a2b5800573492be)