此种方法看似没有什么问题,但其实则有一个漏洞:在加锁的过程中,客户端顺序的向复述,服务器发送了SETNX和到期命令,那么假设在SETNX命令执行完成之后,在到期命令发出去之前客户端发生崩溃(或客户端与复述...中的值,不过误差很小可以忽略)
返回 假;
}
}
}
返回 假;
}
/ * *
*尝试获得锁,成功返回真,如果失败或异常立即返回错误的
*
*@paramlockSeconds加锁的时间(秒),超过这个时间后锁会自动释放...(“过期”、钥匙(1),当时(ARGV[2)))
返回 真正的
其他的
返回 假
结束
注意:此脚本中命令的执行并不是严格意义上的原子性,如果其中第二条指令到期执行失败,整个脚本执行会返回错误,但是第一条指令...这个简单的脚本在复述,服务器得到执行,并返回是否得到锁。因为脚本的提交执行只有一条复述,命令,就避免了上面所说的客户端异常问题。...使用脚本在复述,服务器执行这个逻辑可以在一定程度上保证此操作的原子性
*(即不会发生客户端在执行setNX和到期命令之间,发生崩溃或失去与服务器的连接导致过期没有得到执行,发生永久死锁)
*