zookeeper 赋值操作报version No is not valid

设置节点数据

语法:set path data [version]
path:节点路径
data:节点数据
version:数据版本号(节点状态dataVersion的值)

shell> set /node_01 hello
cZxid = 0x2f
ctime = Sat Nov 12 15:54:05 CST 2016
mZxid = 0x30
mtime = Sat Nov 12 15:55:01 CST 2016
pZxid = 0x2f
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0

此时可以看到dataVersion状态的值变成了1。默认不加版本号则会覆盖节点之前设置的数据,如果加上版本号,版本号必须和服务器上的版本号一致,否则会报错,如下所示:

shell> set /node_01 updatedata 2
version No is not valid : /node_01

这种机制和数据库中的乐观索机制非常相似。

想象一种场景,在获取某个节点的数据之后,利用数据处理完业务逻辑,不加版本号,直接修改节点的数据。但在获取和修改节点数据的这一小段时间窗内,很有可能有其它客户端也修改了该节点的数据,而节点数据变化会使节点状态的dataVersion值递增。如果我们获取节点数据处理完成自己的业务逻辑,然后不加上版本号直接修改节点数据时,则会覆盖掉其它客户端修改的最新数据,从而导致数据不一致的情况。所以要保证数据的一致性时,修改节点数据时,应该加上最新的版本号。而在这个场景中,我们在处理完业务逻辑,再修改节点数据时带上节点的版本号,这时若有其它节点修改了数据,修改则会失败。此时我们应该马上再获取一次节点的最新版本号,再做修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值