读关注 "snapshot"
5.0 版本中的更改。
具有读关注 "snapshot"
的查询会返回最近某个特定时间点跨分片出现的多数提交数据。仅当事务以写关注 "majority"
提交时,读关注
"snapshot"
才提供保证。
读关注 "snapshot"
可用于多文档事务,以及从 MongoDB 5.0 开始,多文档事务之外的某些读取操作。
如果事务不是因果一致会话的一部分,则在以写关注
"majority"
提交事务时,保证已从多数提交数据的快照中读取事务操作。如果事务是因果一致会话的一部分,则在以写关注
"majority"
提交事务后,保证事务操作从多数提交数据的快照中读取,该快照与事务开始前立即执行的操作具有因果一致性。
重要
"snapshot"
读取只能在 minSnapshotHistoryWindowInSeconds
指定的时间段内执行。持续时间超过 minSnapshotHistoryWindowInSeconds
的读取操作可能会终止。
在多文档事务之外,读关注 "snapshot"
可在主节点和从节点上用于以下读取操作:
所有其他读取命令都禁止 "snapshot"
。
操作
有关接受读关注的所有操作的列表,请参阅支持读关注的操作。
读关注和事务
多文档事务支持读关注 "snapshot"
以及 "local"
和 "majority"
。
注意
您可以在事务级别设置读关注,而不是在单个操作级别。要为事务设置读关注,请参阅事务和读关注(read concern)。
读关注和 atClusterTime
版本 5.0 中的新增功能。
在多文档事务之外,具有读关注 "snapshot"
的读取支持可选参数 atClusterTime
。参数 atClusterTime
支持您指定读取的时间戳。为了满足有指定 T 的 atClusterTime
的读取请求,mongod
根据时间 T 时可用的数据执行该请求。
您可以从 db.runCommand()
的响应或从
Session()
对象获取操作的
operationTime
或
clusterTime
。
以下命令执行具有读关注 "snapshot"
的查找操作,并指定该操作应在集群时间 Timestamp(1613577600, 1)
从快照读取数据。
db.runCommand( { find: "restaurants", filter: { _id: 5 }, readConcern: { level: "snapshot", atClusterTime: Timestamp(1613577600, 1) }, } )
如果未提供参数 atClusterTime
,则 mongos
或在单个成员副本中设置 mongod
,选择最新的多数提交快照的时间戳作为 atClusterTime
,并将其返回给客户端。
在事务之外,"snapshot"
读取保证从多数提交的数据中进行读取。
atClusterTime
注意事项和行为
atClusterTime
的允许值取决于minSnapshotHistoryWindowInSeconds
参数。minSnapshotHistoryWindowInSeconds
是存储引擎保留快照历史记录的最小时间窗口(秒)。如果指定的 atClusterTime 值早于根据minSnapshotHistoryWindowInSeconds
保留的最早快照,则mongod
将返回错误。如果使用
"snapshot"
对延迟的副本集成员执行读操作,则返回的多数提交数据可能会过时。在因果关系一致的会话
中,不可能为
"snapshot"
指定atClusterTime
。
针对固定大小集合的读关注
从MongoDB8.0 开始,您可以在固定 大小"snapshot"
集合上使用读关注(read concern) 。