说我有以下数据结构:

{ "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是否可能?

#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。

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

  ask by sanyi translate from so

未解决问题?本站智能推荐:

1回复

Rethinkdb使用条件检查进行多次更新

我在python中有一个关于rethinkdb请求的问题。 我有一个这样的嵌套文档: 该文档经常由一个或多个工人更新(在500ms和2-3s之间)。 它是针对特定类型更新的位置值。 为了确保插入最新的值,我想对字段'lastest_update'执行检查(以确保我提取的新值比r
1回复

RethinkDB:​​多重比较过滤

通过文档,看来为了过滤所有30岁或40岁的用户,我可以这样做(使用python): 假设我有一个基于输入/请求的列表:[12、14、18、88、33 ...],如何通过迭代来过滤处于列表中上述元素之一年龄的所有用户(而不是硬编码)?
1回复

Rethinkdb查询不起作用

我在Rethinkdb上执行以下查询: 当直接在他们网站上的Data Explorer上运行并返回我的结果时,它运行完美。 但是,当我在Python程序中进行相同的查询时,我什么也没得到。 我写的查询是: 这里返回的records为空。 我认为这两个是等效的。 我还尝试将
1回复

Rethinkdb:“连接已关闭”

我正在将 rethinkdb 与在 Windows 机器上本地托管的烧瓶(python 3)一起使用。 问题是连接经常被关闭。 错误如下所示: 在python中我定义了这样的连接: 我的查询示例:
1回复

在RethinkDB上同时创建多个表

如果数据库不存在,我写了一个小脚本在RethinkDB中创建数据库和一些表。 我正在使用Python Shell与RethinkDB通信 这可以很好地工作并创建数据库(如果不存在),但是它仅创建第一个表Carts并跳过下一个请求。 我尝试了这个 但是我收到无效的语法错
1回复

通过python在rethinkdb上插入数据时出错

使用以下python脚本: 我试图解析XML文档并将其插入rethinkdb。 当我启动python3 file.py时,我看到以下错误: 预期为OBJECT类型,但已找到STRING 我的脚本有什么问题? 谢谢。
2回复

Rethinkdb-函数属性错误

我正在编写一个大致遵循此示例的应用程序。 当我提交POST请求时,例如: curl http://localhost:5000/todos -d "data=Remember the milk" -X POST 我从RethinkDB收到以下错误: rethinkdb/as
1回复

使用RethinkDB进行“全文搜索”

我目前正在开发一个Web应用程序,理想情况下,我可以在将要为用户存储的文档上支持搜索栏。 这些文档中的每一个都将成为一个小尺寸的文章。 (我不认为任何文档会比用于搜索目的的几KB文本更大)因为我一直在阅读有关使用RethinkDB的正确方法,其中一些信息已经引起了我的担忧是对非索引数据进行过