【问题标题】:How can I do an atomic operation to a document field in ArangoDB?如何对 ArangoDB 中的文档字段进行原子操作?
【发布时间】:2014-05-26 04:19:48
【问题描述】:

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

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

还有其他方法吗?

谢谢,

迭戈·古拉伊布

【问题讨论】:

  • 您好 Diego,恐怕您的问题不太清楚。 ArangoDB 单文档写入是原子的,不使用事务。这是你要求的吗?
  • 对不起,如果我不清楚,我的原子操作的意思是,例如,将文档中的计数器增加 1 或减少计数器。

标签: arangodb nosql-aggregation nosql


【解决方案1】:

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

  1. 让客户端获取获取计数器值,增加它并将更新的文档发送回服务器。更新时,检查文档的 etag / 修订 ID 是否有并发更新,如果有则重复
  2. 创建一个执行更新的服务器端事务。一个示例(不使用计数器,但可以在此处找到列表修改:https://groups.google.com/forum/#!topic/arangodb/2t9RV4eYUi4
  3. 分别保存每个计数器修改操作(例如 {"op":"inc","value":1}),并使用服务器端任务定期计算当前计数器。如果需要,也可以以增量方式实施此替代方案 3。

备选方案 1 将需要至少 2 次 HTTP 调用(获取 + 更新),并且您需要针对并发更新的情况进行错误处理。所以用处不大。

从客户的角度来看,我认为备选方案 2 将是最容易使用的。它允许通过 REST API 公开“增加计数器”操作,并且可以在原子事务中实现获取和更新。

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

【讨论】:

  • 我认为备选方案 3 更适合我的情况。我将开始着手解决这个问题,因为我需要很多柜台。谢谢@stj
猜你喜欢
  • 2012-03-05
  • 1970-01-01
  • 2016-08-20
  • 2012-03-16
  • 1970-01-01
  • 1970-01-01
  • 2014-10-11
  • 1970-01-01
  • 2022-01-10
相关资源
最近更新 更多