read-concern

“readConcern” 选项允许您控制从副本集和副本集分片读取的数据的一致性和隔离属性。

通过有效使用写入关注点和读取问题, 您可以根据需要调整一致性和可用性保证的级别, 例如等待更强的一致性保证, 或放松一致性要求以提供更高的一致性要求可用性。

mongodb 驱动程序更新为 mongodb 3.2 或更高版本的支持, 指定读取注意事项。

读取的级别

local

查询返回实例中的数据, 但不能保证数据已写入副本集成员的大多数 (即可以回滚)。

默认值为:

  1. 读取对主

  2. 如果读取与因果关系一致的会话相关联, 则对辅助程序进行读取。

  3. 读取关注本地可用于因果关系一致的会话和事务。

available

查询返回实例中的数据, 但不能保证数据已写入副本集成员的大多数 (即可以回滚)。

如果读取与因果关系一致的会话不关联, 则针对辅助程序的读取的默认值。

对于共享集合, “可用” 读取关注提供了各种读取关注之间可能的最低延迟读取, 但代价是一致性, 因为 “可用” 读取关注可以返回孤立的文档。

majority

查询返回已由大多数副本集成员确认的数据。读取操作返回的文档是持久的, 即使在发生故障的情况下也是如此。

若要使用 “多数” 的读取关注级别, 副本集必须使用 wiredtiger 存储引擎。

对于 mongodb 4.0.3 + (和 3.6.1 +), 您可以禁用阅读关注 “多数”。

注意

对于多文档事务中的操作, 改为 “关注” 多数 “仅在事务提交时提供其担保, 并与书面关注” 多数 “。

否则, “多数” 读取关注项不提供对事务中读取的数据的保证。

linearizable

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

如果您的大多数副本集成员在读取操作后崩溃并重新启动, 则读取操作返回的文档是持久的, 如果写入协商专业新闻声明设置为 true 的默认状态。

在编写本组织的情况下, mongodb 不会等待 w: “多数人” 写入写入写入写入磁盘, 然后再确认写入。

因此, 在给定副本集中的大多数节点暂时丢失 (例如崩溃和重新启动) 的情况下, 大多数写入操作可能会回滚。

您可以只为主上的读取操作指定可线性化的读取注意事项。

可线性化的读取关注不可用于因果关系一致的会话。

线性读取注意保证仅适用于读取操作指定唯一标识单个文档的查询筛选器的情况。

提示

如果大多数具有数据的成员不可用, 请始终使用具有线性化读取问题的 maxTimeMS。

maxTimeMS 可确保操作不会无限期地阻止, 而是确保在无法满足读取问题时操作返回错误。

预读支持

读取关注选项

对于不在多文档事务中的操作, 可以将 “读取关注” 级别指定为支持读取关注的命令和方法的选项:

readConcern: { level: <level> }

若要指定 mongo shell 方法 db.collection.find() 的读取关注级别, 请使用 cursor.readConcern() 方法:

db.collection.find().readConcern(<level>)

Transactions and Available Read Concerns

对于多文档事务, 可以在事务级别设置读取关注项, 而不是在单个操作级别设置读取关注项。

事务中的操作将使用事务级别读取关注。在事务中忽略集合和数据库级别上设置的任何读取关注点。

如果显式指定了事务级读取关注项, 则事务中也会忽略客户端级别的读取关注项。

重要

不要明确设置单个操作的读取关注。

若要设置事务的读取关注, 请参阅事务选项 (阅读一致/阅读首选项)。

您可以在事务开始时设置读取关注:

对于多文档事务, 请阅读 “关注级别” 快照 “、” 本地 “和” 多数 “。

提示

对于 “local” 和 “majority” 的关注, mongodb 可能会提供比指定更强的隔离保证。

具体来说, 在 mongodb 4.0 中, 所有多文档事务都有 “快照” 隔离。

在 mongodb 的未来版本中, 服务器将围绕指定的读取问题 (隔离级别) 进行优化, 而不是提供比显式指定的更强的隔离保证。

因此, 如果需要比 “local” 和 “majority” 更有力的保证阅读关注, 则明确指定适当的阅读关注, 而不是依赖 mongodb 来提升阅读关注级别。

编写作为多文档事务一部分的命令可以支持事务级读取问题。

如果在事务开始时未指定, 则事务使用会话级别的读取关注, 或者, 如果未设置, 则客户端级别读取关注。

有关详细信息, 请参阅事务读取问题。

TODO…

其他内容…

参考资料

read-concern