MySQL中的锁有:
共享锁(读锁),排他锁(写锁),
悲观锁:认为总是有线程并发问题,所以数据一直处于锁定的状态
乐观锁:与悲观锁相反,数据不会被锁定,当出现问题的时候再把错误信息返回给用户
悲观锁和乐观锁都只是一种思想理念,并不是锁
行锁(记录锁(在唯一索引或主键上加记录锁,防止其他事务干预)、间隙锁(双开区间)、临键锁(左开右闭区间))锁定部分行,性能好,
页锁、表锁(锁定一张表,性能差)
什么是分布式锁:
在分布式系统下,保证只能进行一个线程的访问操作使用的锁
分布式锁的实现方案:
1.基于数据库(唯一索引和主键)
2.基于redis(setnx)
3基于zookeeper:四个节点:1.持久节点 2.持久顺序节点 3.临时节点 4.临时顺序节点
数据库实现分布式锁的方案:
单独创建一张表,利用主键和唯一索引,如果能添加进去数据说明没有被锁,不能添加数据说明锁还没有被释放。
redis实现分布式锁的方案(setnx):
1.设置锁超时
2.解决原子性问题,将锁超时和获取锁合并到同一步执行,set命令
3.解决误删问题,创建uuid来判断是否是自己的锁,
4.还是解决误删问题(保证 获取锁 -> 判断锁 -> 删除锁 的原子性 ),redis+lua脚本来解决
5.如果没有获取到锁,实现可重入,过会儿再进入
redission中有哪些锁:
1.可重入锁
2.公平锁(有顺序,当某个线程出现问题,停留5s,继续下个线程)
3.联锁(关联多个对象)
4.红锁:例如主从,当主出现问题了,从去替换主然后成为主,但是再替换的过程中像原来的主传了数据,导致新的主没有那段数据,这就是脑裂问题。
5.读写锁
6.闭锁:所有线程执行完才会释放,否则一直闭锁
7.信号量
zookeeper实现分布式锁:
1.临时节点+重试:先执行的线程会在zookeeper创建一个临时节点,代表获取到锁,后面的线程需要等待,直到前面的临时节点被删除,代表锁释放,后面的线程开始尝试获取锁
2.临时顺序节点+watch(监听):每个线程都创建一个临时顺序节点,第一个节点获取到锁,其他节点拿不到锁,然后监听第一个节点被删除后,第二个节点再去成为第一个节点,后面依此类推。
最后
以上就是背后外套最近收集整理的关于分布式锁的相关总结的全部内容,更多相关分布式锁内容请搜索靠谱客的其他文章。
发表评论 取消回复