一、分布式锁
1、分布式锁应该是怎样的:
(1)互斥性:分布式部署的应用集群中,一个方法只能被一台机器上 的一个线程执行
(2)这把锁要是可重入的,避免死锁
(3)有高可用的获取锁和释放锁功能,性能要好
2、分布式锁的三种方式:
(1)基于数据库实现分布式锁
有悲观锁、乐观锁。
悲观锁实现方式是独占数据,其他线程等待,不会出现修改冲突,对于数据敏感且读取频率低的场景用
乐观锁通过增加递增的版本号字段实现。乐观锁认为数据一般不冲突,只有在提交更新时才会检测冲突,适用于读取频率高而修改少的场景
(2)基于缓存(redis等)实现分布式锁
Jedis.set(key,value,nxxx,expx,time)
(3)基于zookeeper实现分布式锁
客户端对某个方法加锁是,在zk上与该方法对应的指定节点的目录下生成唯一的瞬时有序节点,判断是否获取锁只需要判断有序节点中序号最小的一个
释放锁时删除瞬时节点
二、数据库锁级别
1、行级锁:特点与表锁刚好相反
Record locks 记录锁,对索引项加锁
Gap lock 间隙锁,锁定一个范围,不包含记录本身:select c1 from t1 where c1 between 10 and 20 for update
Next-key 锁是记录锁+间隙锁,锁定一个范围且锁定记录本身
2、表级锁:锁整张表,开销小,加锁快,不会出现死锁,锁粒度大,发生锁冲突概率最高
3、三级封锁协议
一级:修改数据加x排他锁直到事务结束才释放
二级:在一级基础上,事务读数据之前先加s锁,读完释放s锁(防止丢失修改且防止读'脏'数据),不能保证可重复读
三级:在二级基础上,事务读数据前加s锁,直到事务结束才释放锁,解决可重复读问题;