我正在开发分布式数据库。我处于这样一种情况:在一个分区的愈合过程中(节点开始识别它们被分开的节点),两个不同的客户端尝试提交一个3到4的比较和设置,两者都是成功的。从逻辑上讲,这应该是不可能的,但我很好奇是否有任何功能问题,两者都返回成功。两个客户端都正确地相信最终状态是什么,并且他们发出的命令是成功的。我想不出任何严重的问题。有没有?
答案 0 :(得分:0)
"标准" CAS的定义(在某种程度上存在这样的事情?)保证最多只有一个作者会看到特定转换的成功响应。一些依赖于此保证的示例:
// generating a unique id
while (true) {
unique_id = read(key)
if (compare_and_set(key, unique_id, unique_id + 1)) {
return unique_id
}
}
如果两个客户都阅读3
并成功执行compare_and_set(key, 3, 4)
,那么他们都认为他们已经声称" 3作为他们独特的身份,并可能最终在路上相撞。
// distributed leases/leader election
while (true) {
locked_until = read(key)
if (locked_until < now()) {
if (compare_and_set(key, locked_until, now() + TEN_MINUTES)) {
// I'm now the leader for ~10 minutes.
return;
}
}
sleep(TEN_MINUTES)
}
这里有类似的问题:如果两个客户看到锁是可用的并且都成功获得CAS,那么他们都认为他们同时是领导者。