深入理解分布式事务

分布式事务及其一致性协议

Redis事务 MULTI、EXEC、Watch

分布式锁(数据库、redis(redis主要看下面那篇,这里仅参考)、zk)

整理分布式锁:业务场景&分布式锁家族&实现原理

分布式锁zk:
步骤:创建一个目录,加锁就在该目录下创建节点,解锁就删除节点, 创建的节点是临时顺序节点,该目录下的兄弟节点,最小的节点获得锁,每个节点监听前一个节点,如果前一个节点删除了,也就是解锁了,则表示自己是最小节点,从而可以加锁。
原由:
1. 用临时节点是为了防止死锁,如果一个节点获得了锁,然后挂掉了,则就只能一直占有锁,因此通过临时节点就可以解决该问题,服务挂掉,节点就会自动删除,从而解锁
2. 用临时顺序节点是为了解决节点释放时需要通知所有的服务,则就会占用大量的资源和带宽,通过顺序节点就只需要每个节点监听前一个节点,从而合理利用资源
其他:
1. 如果因为网络抖动,zk就会误以为服务挂了,从而删除临时节点,因此需要重试机制,多次重试之后还不行,才会删除临时节点
2. 对于锁的可重入,只需要带上线程信息或者机器信息等唯一的标识,获取的时候判断一下就行了

redis看这篇文章

redis锁和zookeeper锁区别:
1、redis分布式锁,其实需要自己不断去尝试获取锁,比较消耗性能。
2、zk分布式锁,获取不到锁,注册个监听器即可,不需要不断主动尝试获取锁,性能开销较小。
3、zk需要频繁的创建和删除节点,性能上不如Redis方式。
4、redis获取锁的那个客户端bug了或者挂了,那么只能等待超时时间之后才能释放锁。
5、而zk的话,因为创建的是临时znode,只要客户端挂了,znode就没了,此时就自动释放锁。