对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

读关注 (read concern) "snapshot"

在版本5.0中进行了更改。:

具有读关注 "snapshot" 的查询会返回最近某个特定时间点跨分片出现的多数提交数据。仅当事务以写关注 "majority" 提交时,读关注 "snapshot" 才提供保证。

读关注 "snapshot" 可用于多文档事务,以及从 MongoDB 5.0 开始,多文档事务之外的某些读取操作。

  • 如果事务不是因果一致会话的一部分,则在以写关注 "majority" 提交事务时,保证已从多数提交数据的快照中读取事务操作。

  • 如果事务是因果一致会话的一部分,则在以写关注 "majority" 提交事务后,保证事务操作从多数提交数据的快照中读取,该快照与事务开始前立即执行的操作具有因果一致性。

重要

"snapshot" 读取只能在 minSnapshotHistoryWindowInSeconds 指定的时间段内执行。持续时间超过 minSnapshotHistoryWindowInSeconds 的读取操作可能会终止。

在多文档事务之外,读关注 "snapshot" 可在主节点和从节点上用于以下读取操作:

所有其他读取命令都禁止 "snapshot"

有关接受读关注的所有操作的列表,请参阅支持读关注的操作。

多文档事务支持读关注 "snapshot" 以及 "local""majority"

注意

您可以在事务级别设置读关注,而不是在单个操作级别。要为事务设置读关注,请参阅事务和读关注(read concern)。

在多文档事务之外,具有读关注(read concern) "snapshot" 的读取支持可选参数 atClusterTime。参数 atClusterTime 支持您指定读取的时间戳。为了满足指定 T 的 atClusterTime 的读取请求,mongod 根据时间 T 可用的数据执行该请求。如果 mongod 在其 oplog 中尚未达到时间 T,则会等待处理该请求。

提示

如果您的读取指向滞后的副本集节点,则可以使用 maxTimeMS 来限定具有指定 atClusterTime 的读取的等待时间。maxTimeMS 确保操作不会无限期受阻,而是在 mongod 未能及时达到指定 atClusterTime 时返回错误。

您可以从 db.runCommand() 的响应或从 Session() 对象获取操作的 operationTimeclusterTime

以下命令执行具有读关注 "snapshot" 的查找操作,并指定该操作应在集群时间 Timestamp(1613577600, 1) 从快照读取数据。

db.runCommand( {
find: "restaurants",
filter: { _id: 5 },
readConcern: {
level: "snapshot",
atClusterTime: Timestamp(1613577600, 1)
},
} )

如果未提供参数 atClusterTime,则 mongos 或在单个成员副本中设置 mongod,选择最新的多数提交快照的时间戳作为 atClusterTime,并将其返回给客户端。

在事务之外,"snapshot" 读取保证从多数提交的数据中进行读取。

  • atClusterTime 的允许值取决于 minSnapshotHistoryWindowInSeconds 参数。minSnapshotHistoryWindowInSeconds 是存储引擎保留快照历史记录的最小时间窗口(秒)。如果指定的 atClusterTime 值早于根据 minSnapshotHistoryWindowInSeconds 保留的最早快照,则 mongod 将返回错误。

  • 如果使用 "snapshot" 对延迟的副本集节点执行读操作而未指定 atClusterTime,则返回的大多数提交数据可能已过时。如果指定 atClusterTime,则 mongod 会等待指定的时间戳,而不是返回过时数据,但读取可能会阻塞或超时。

  • 因果关系一致的会话中,不可能为 "snapshot" 指定 atClusterTime

从MongoDB8.0 开始,您可以在固定 大小"snapshot" 集合上使用读关注(read concern) 。