我正在努力了解什么是' atomic'更新是关于etcd。
当我想到原子'时,我认为之前有一个'和'之后' (没有在期间,如果更新失败,它仍然是在'之前)。
以下是一个例子:
curl -s -XPUT http://localhost:2379/v2/keys/message -d value='Hidee Ho'
因此,此时,任何人都可以访问该消息并获取当前值:
curl -s http://localhost:2379/v2/keys/message
{"action":"get","node":{"key":"/message","value":"Hidee Ho","modifiedIndex":4748,"createdIndex":4748}}
稍后,我可以修改此值,如下所示:
curl -s -XPUT http://localhost:2379/v2/keys/message -d value='Mr Hanky'
结果可以像以前一样获取。在我改变价值之前,Hidee Ho'在改变价值之后,Hanky先生'回来。所以,我的问题是我保证结果中的一个或另一个?也就是说,我想确认将返回一个或另一个(而不是 nil 值在结果之间)。
我并不特别关心时间安排。如果我做了Hanky先生的更新,并且随后的价值继续在短时间内获得了Hidee Ho,那就没问题了。
我很困惑,因为协议中有一个Atomic CompareAndSwap 函数。据我所知,它不是那么多原子,因为它只是更新,如果价值是我说的那就是'。就我而言,我不太关心过去的价值。我只是想知道它已被改变,没有读者会看到除了之前的其他内容。或者'之后'值。
答案 0 :(得分:4)
你是正确的,因为普通的PUT是原子的,因为客户端只会看到前一个值或新值。
CompareAndSwap功能允许您进行乐观锁定,以便您可以编写取决于先前值的新值,例如:一个柜台。如果你在不使用CompareAndSwap的情况下实现一个计数器,你就会有类似write("count", 1 + read("count"))
的东西,在这种情况下,读取和写入是分开的,如果2个呼叫者同时这样做,那么它们可能是&# 39; d都看到相同的起始值,并且你松开其中一个增量。使用CAS时,调用者可以说只有当前一个值为11时才将其设置为12,现在如果同时发生这种情况,其中一个写入将失败,然后它可以重新读取并重新应用其增量,这样您就不会使用CAS。 t松散任何增量。