Go etcd事务中的原子计数器增量
我正在使用go with etcd作为DB,并尝试为原子计数器进行事务处理。我需要有两个先决条件的交易:Go etcd事务中的原子计数器增量,go,transactions,atomic,etcd,Go,Transactions,Atomic,Etcd,我正在使用go with etcd作为DB,并尝试为原子计数器进行事务处理。我需要有两个先决条件的交易: 存在一些键,例如:clientv3.Compare(clientv3.Version(wantedKey),“!=”,0) 计数器小于一些maxVal,即:clientv3.Compare(clientv3.Value(counterKey),“是,很遗憾(令人惊讶)etcd似乎不提供任何原子inc/dec操作。唯一的方法似乎是执行两个单独的事务,首先读取当前值,然后执行一个事务,该事务具有
clientv3.Compare(clientv3.Version(wantedKey),“!=”,0)
maxVal
,即:clientv3.Compare(clientv3.Value(counterKey),“是,很遗憾(令人惊讶)etcd似乎不提供任何原子inc/dec操作。唯一的方法似乎是执行两个单独的事务,首先读取当前值,然后执行一个事务,该事务具有两个比较,再加上对密钥版本的检查,如果所有3个检查都通过,则输入递增的值
正如您所说,您需要在循环中执行此操作,因为并发客户端可能已经更改了第一个事务(读取)和第二个事务(比较数据集)之间的值
这是一种非常低效的处理计数器的方法。Inc或Dec运算将使许多事情变得更容易,但只有Put,它不能引用任何东西,只携带一个指定的值
另请参见Github的问题:是,很不幸(令人惊讶)etcd似乎不提供任何原子inc/dec操作。唯一的方法似乎是执行两个单独的事务,首先读取当前值,然后执行一个事务,该事务具有两个比较,再加上对密钥版本的检查,如果所有3个检查都通过,则输入递增的值
正如您所说,您需要在循环中执行此操作,因为并发客户端可能已经更改了第一个事务(读取)和第二个事务(比较数据集)之间的值
这是一种非常低效的处理计数器的方法。Inc或Dec运算将使许多事情变得更容易,但只有Put,它不能引用任何东西,只携带一个指定的值
另请参见此Github问题: