setData 版本检查有没有ABA 问题?

来源:8-2 ZooKeeper数据模式及ZNode节点的特性

慕沐0177137

2022-05-11

如题

写回答

1回答

大能老师

2022-05-11

ABA问题,是使用CAS的方式会存在的一个问题。而ZooKeeper每个节点都有数据版本的概念,在调用setData更新操作的时候,是可以通过version这个参数来解决ABA问题。

实际上ZooKeeper的setData接口的version参数正是由CAS原理演化而来的。CAS的逻辑是:“对于值V,每次更新前都会比对其值是否是预期值A,只有符合预期,才会将原子化地更新到新值B。” 而setData中的version参数可以对应CAS原理中的预期值,表明这次更新是针对此数据版本进行操作的。假如一个客户端试图进行更新操作,它会携带上次获取到的version值进行更新,而如果在这段时间内,ZooKeeper服务器上该节点的数据恰好已经被其他客户端更新,那么其数据版本一定也发生了变化,这时与客户端携带的version无法匹配,于是便无法更新成功,而如果单纯比较节点的数据才会出现ABA问题,相当于版本号(单调递增属性)是更加严格的约束,即便那个值最后变为符合预期的值,但是版本并非上一个A的版本。


0
0

Java分布式架构设计与开发实战

项目贯穿式讲解,真正将理论与实战相结合

325 学习 · 74 问题

查看课程