Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go etcd事务中的原子计数器增量_Go_Transactions_Atomic_Etcd - Fatal编程技术网

Go etcd事务中的原子计数器增量

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操作。唯一的方法似乎是执行两个单独的事务,首先读取当前值,然后执行一个事务,该事务具有

我正在使用go with etcd作为DB,并尝试为原子计数器进行事务处理。我需要有两个先决条件的交易:

  • 存在一些键,例如:
    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问题: