如何对ArangoDB中的文档字段执行原子操作?

时间:2014-05-26 04:19:48

标签: arangodb nosql-aggregation nosql

我想知道哪个是使用ArangoDB执行此操作的最佳方法,我开始使用事务处理,或使用修订检查更新记录,但对于许多并发更新而言,它并不是很好。

使用新版本2.1,我发现我可以在服务器中注册函数以执行每X个时间,因为我保留了很长一段时间的原始数据,我可以使用一个服务器任务将其视为异步但它给计数器带来了更多的延迟。

还有其他办法吗?

谢谢,

Diego Guraieb

1 个答案:

答案 0 :(得分:2)

目前至少有三种方法可以增加一个计数器:

  1. 让客户端获取获取计数器值,增加它并将更新的文档发送回服务器。更新时,请查看文档的etag / revision id是否有并发更新,如果是则重复
  2. 创建执行更新的服务器端事务。示例(不使用计数器,但可以在此处找到列表修改:https://groups.google.com/forum/#!topic/arangodb/2t9RV4eYUi4
  3. 分别保存每个计数器修改操作(例如{" op":#34; inc",#34;值":1}),并定期计算当前计数器服务器端任务。如果需要,该替代方案3也可以以增量方式实现。
  4. 备选方案1将需要至少2次HTTP调用(提取+更新),并且对于并发更新的情况,您将需要进行错误处理。所以它不是很有用。

    从我认为客户的角度来看,替代方案2将是最容易使用的。它允许暴露"增加计数器"通过REST API进行操作,并且可以在原子事务中实现fetch-and-update。

    备选方案3也可以,如果你能负担得起你的柜台稍微过时了。实施时,应逐步实施,例如,通过保留计数器的总数并在每个更新任务执行时仅添加新值。否则你的"柜台操作"集合将无限增长,更新将变得越来越慢。备选方案#3还具有以下优点:您可以保留最近操作的(小)记录,例如用于审计。