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