时长:大小11.01M
作者回复: 没有问题。 问题的答案:redis实现的分布式锁,都是有一个过期时间,如果一旦服务A出现stop the world的情况,有可能锁过期了,而此时服务A中仍然存在持有锁,此时另外一个服务B又获取了锁,这个时候存在两个服务同时获取锁的可能。
作者回复: 是的,这种情况也同样存在同时获取锁的可能
作者回复: 对的,这种情况也是可能发生的,前提是c节点在宕机之前没有持久化锁。 第二zk锁的问题,如果连接session已经断开,客户端的锁是会释放的,不会存在同时获取锁的情况。
作者回复: 是的,当在RR事务级别下,在数据库中不存在当前key值的情况下,多线程竞争锁会因为意向锁的问题,导致死锁。可降低数据库隔离级别为 Read Commited,这样的话多个事务不会因为意向锁的原因导致死锁了。
作者回复: 鱼和熊掌不可兼得,保证可靠性的前提下,会带来一定的性能损失。 当在一定时间内没有获取到足够节点时,会通过定时任务将已经超时的锁通过lua脚本来释放。
作者回复: 是的,唯一索引可以实现该功能。
作者回复: 对的
作者回复: 可以,使用Redisson就好了
作者回复: 都会设置锁对象
作者回复: 会的
作者回复: 是的
作者回复: 分布式锁是在分布式服务的情况下保证原子性操作,而不是因为数据库产生的分布式锁。 数据库可以实现分布式锁,是一种实现方式。
作者回复: 将以下代码提出到new Thread之外: //zookeeper分布式锁 CuratorFramework zk = CuratorFrameworkFactory.newClient(connUrl, retryPolicy); zk.start(); InterProcessMutex lock = new InterProcessMutex(zk, "/opt/uams/zookeeper-3.4.7/locks");
作者回复: RedLock算法是会去每一个节点获取锁,正常情况下,别的线程无法同时获取锁的。
作者回复: 写入一个单点只实现了高可用,没有实现集群式分布式锁。单点的问题会存在单个节点挂了的情况下,不同应用服务同时获取锁的可能。
作者回复: 应该是一个线程监听,具体需要看源码实现。
作者回复: 是的,根据自己的需求设定。zk锁则没有超时时间问题。