首页 > 解决方案 > MongoDB ,选择不获取最新更新

问题描述

我们有一个小型 Mongo DB 3.2v(2 个节点)用于簿记,其中保存有关要加载到不同 MPP 数据库中的不同文件的信息。

Mongo 只存储文件的文件名和状态。Python 加载过程会更改选择的每个文件的状态(就绪->等待->工作)并加载到另一个 MPP 数据库中。

有多个进程可以并行运行并更改文件的状态。问题是,每当进程 p1 更新文件状态(使用 find_one_and_update)时,大约同时运行的另一个并行进程 p2 不会获得更新的状态该文件并选择与 p1 相同的文件。

为什么我会在 Mongo 上观察到这个一致性问题?

读取并没有反映最新的写入。这会导致我们最终加载同一个文件两次的问题。

标签: mongodbconsistency

解决方案


如果您的中间层没有缓存系统,则可能需要更改查询和操作的相关读写问题

由于您有多个节点,您可能会返回尚未在所有成员之间确认更新的查询。

查询默认为local

具有读取关注“本地”的查询从实例返回数据,但不保证数据已写入大多数副本集成员(即可能回滚)。

您可能需要更改为可线性化majority

该查询返回的数据反映了在读取操作开始之前完成的所有成功的多数确认写入。在返回结果之前,查询可能会等待并发执行的写入传播到大多数副本集成员。

db.restaurants.find( { _id: 5 } ).readConcern("linearizable").maxTimeMS(10000)

推荐阅读