每个znode都有一个与它关联的版本号,每当它的数据发生变化时就增加。API中有一对操作可以被有条件的执行:setData和delete。两个调用都需要版本号作为一个入参,只有当客户端传递的版本号和服务器当前的版本号一致时才会执行成功。当有多个zookeeper的客户端在同一个znode上操作时版本号就很有用了。比如说,客户端C1向\/config节点写入一些配置信息。如果另外一个客户端C2并发的更新这个节点,那么C1的版本号就是明日黄花了,那么C1的setData操作b必须不会成功。使用版本号避免了这种情况。在这种情况下,当写回时,C1使用的版本号不匹配,那么操作就失败了。图2-4详细的描述了这一场景。

    版本 - 图1

    图2-4 使用版本号来防止并发更新引起的不一致性