0

假设我有以下数据结构:

{ "name": "i1", "time": 1, "status": 1}
{ "name": "i2", "time": 2, "status": 1}
{ "name": "i3", "time": 3, "status": 1}
{ "name": "i4", "time": 4, "status": 2}

我需要检索时间最长且“状态”= 1 的项目。然后将其“状态”更新为 2,这一切都是原子的,因此其他消费者无法同时检索相同的项目。

这可能与 rethinkdb 吗?

4

1 回答 1

1

由于 RethinkDB 中的原子性仅在每个文档级别上得到保证,这只是部分可能的。

你可以这样做:

r.table(...)
  .orderBy(index=r.desc("time"))
  .filter({status: 1})
  .limit(1)
  .update(r.branch(r.row["status"] == 1, {status: 2}, {}), return_changes=True)

里面的所有东西都update将被原子应用。因此,如果条目的状态已经被另一个客户端设置为 2,查询将返回 {unchanged: 1} 并且您可以再次运行它,直到它成功执行更新。

但是,它不保证在更新完成时,所选文档仍然是时间最长的文档。另一个客户端可以在此查询运行时插入一个时间更长的新文档,这将使查询将当时唯一的第二大文档的状态更新为 2。

为了完全防止这种情况,您需要对表使用显式互斥锁或读/写锁。

于 2015-03-31T23:59:58.093 回答