【发布时间】:2016-05-30 11:38:00
【问题描述】:
我们有一个客户端连续写入两个文档(使用{w:1})。
例如,原始文件可能是:
{_id: "a", value: 0},
{_id: "b", value: 0}
客户端将文档“a”更新为{_id: "a", value: 1},然后在更新完成后,客户端将文档“b”更新为{_id: "b", value: 1}。
之后第二个客户致电find({})。第二个客户端从辅助客户端读取,可能尚未收到所有更改。
显然它可以读取以下状态:
-
{_id:"a",value:0},{_id:"b",value:0} -
{_id:"a",value:1},{_id:"b",value:0} -
{_id:"a",value:1},{_id:"b",value:1}
这是主节点上的“真实”状态(在过去的某个时刻)。
第二个客户端能否看到如下状态:{_id:"a",value:0},{_id:"b",value:1}?请注意,该状态在主节点上从未存在过。
附: here的解释说:
Secondary ... 按照它们在 oplog 中出现的顺序应用写操作。
这是否意味着辅助节点会按照它们在主节点上更新的顺序更改其文档?
附: find cursors 是否“冻结”他们正在阅读的文档的状态(即忽略创建光标后所做的更改)?如果我使用find(...).sort({_id:-1}) 或者文档“a”的 id 是“c”(即大于“b”),情况会有所不同吗?
谢谢
【问题讨论】:
标签: mongodb eventual-consistency mongodb-replica-set