gpt4 book ai didi

在两个文档上写入时 Mongodb 在副本集上的最终一致性

转载 作者:可可西里 更新时间:2023-11-01 10:42:15 24 4
gpt4 key购买 nike

我们有一个客户端连续写入两个文档(使用 {w:1})。例如,原始文档可能是:

{_id: "a", value: 0},{_id: "b", value: 0}

并且客户端将文档“a”更新为{_id: “a”, value: 1} 然后,更新完成后,客户端将文档“b”更新为{ _id: "b", 值: 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说:

Secondaries ... apply write operations in the order that they appear in the oplog.

这是否意味着从属节点更改文档的顺序与它们在主节点上更新的顺序相同?

附言find 游标是否“卡住”了它们正在阅读的文档的状态(即忽略创建游标后所做的更改)?如果我使用 find(...).sort({_id:-1}) 或者文档“a”的 id 是“c”(即大于“b”),情况会有所不同吗)?

谢谢

最佳答案

第一个问题:是的,次要操作的执行顺序与主要操作相同。所有操作都记录在oplog中. oplog 本身不是执行查询的日志(即 updateMany()),而是必须对实际文档执行的操作,因此它的操作变得幂等。

关于游标操作。在游标上迭代时,文档可能会被移动或更新。甚至可能会发生,如果同一文档的索引或存储位置在更新期间发生变化,则它会在光标上出现两次。

有一个特殊的snapshot提供某种隔离的模式,但它有一些限制,即它不能与分片一起使用

关于在两个文档上写入时 Mongodb 在副本集上的最终一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37524741/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com