“文档” 菜单
文档首页
/
MongoDB Manual
/ /

读关注 (read concern) "snapshot"

在此页面上

  • 操作
  • 读关注和事务
  • 读关注和 atClusterTime
  • 针对固定大小集合的读关注

4.0 版本中的新功能

5.0 版本中的更改

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

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

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

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

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

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

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

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

注意

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

版本 5.0 中的新增功能

在多文档事务之外,具有读关注 "snapshot" 的读取支持可选参数 atClusterTime。参数 atClusterTime 支持您指定读取的时间戳。为了满足有指定 T 的 atClusterTime 的读取请求,mongod 根据时间 T 时可用的数据执行该请求。

您可以从 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" 对延迟的副本集成员执行读操作,则返回的多数提交数据可能会过时。

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

从版本 5.0 开始,读取固定大小集合时不能使用读关注 "snapshot"

← 读关注 (read concern)