2

如何可靠地获取表格的内容,然后对其进行更改,而不会出现间隙或重叠?随着时间的推移,我试图最终获得一致的表格视图。

我可以先查询数据库,然后订阅更改源,但这些查询之间可能存在修改发生的间隙。

或者我可以先订阅更改,然后查询表,但随后可能会在查询中处理的更改提要中发生修改。

这种情况的例子:

A subscribe 'messages'
B add 'messages' 'message'
A <- changed 'messages' 'message'
A run get 'messages'
A <- messages

这里 A 在发送消息查询之前收到了“已更改”消息,并且消息查询的结果包括已更改的消息。可能 A 在收到查询结果之前可以简单地忽略任何更改的消息。是否保证在查询后(在同一连接上)收到的更改尚未应用于前一个查询,即在同一线程上处理?

推荐的方法是什么?我找不到有关此用例的任何文档。

4

2 回答 2

1

RethinkDB 的 Michael Lucy 写道:

你应该没问题,因为我们已经为这些发送了查询的初始.get.changes值。.order_by.limit.changes对于其他查询,现在唯一的方法是订阅查询的更改,执行查询,然后从 changefeed 中读取并丢弃读取之前的任何更改(如何执行此操作取决于您读取的内容)重新执行以及对其进行哪些合法更改,但破解它的最简单方法可能是timestamp向您的对象添加一个字段,每当您进行更新时都会增加该字段)。

在 2.1 中,我们计划添加一个可选参数return_initial,它将自动执行我刚刚描述的操作,而无需更改您的文档架构。

于 2015-03-04T11:32:42.487 回答
1

我知道你说你想出了一个答案,但我已经做了很多,这就是我一直在做的事情:

r.db('test').table('my_table').between(tsOne, tsTwo, {index: 'timestamp'});

因此,在我的工作中,我运行一个索引between查询,该查询捕获上次运行时间和那个确切时刻之间的数据。您可以在配置表上运行锁定,以跟踪您的作业的 last_run_time,以便您甚至可以使用多个处理器进行扩展!而且因为我们正在使用between等待锁定完成的下一个作业,所以只会在第一个处理器运行后抓取数据。希望有帮助!

于 2015-03-03T15:14:14.183 回答