读取关注点"快照"
已更改在版本5.0.
具有读取关注点 "快照"
的查询返回最近过去特定单一点时间跨多个分片所显示的大多数已提交数据。读取关注点 "快照"
仅在其事务与具有写入关注点的写入提交时提供其保证"多数派"
.
读取关注点 "快照"
对 多文档事务 可用,并从MongoDB 5.0开始,对某些多文档事务之外的操作。
如果事务不是 因果一致会话 的一部分,则在具有写入关注点
"多数派"
的提交事务后,事务操作保证从大多数已提交数据的快照中读取。如果事务是 因果一致会话 的一部分,则在具有写入关注点
"多数派"
的提交事务后,事务操作保证从大多数已提交数据的快照中读取,该快照与事务开始前立即执行的操作提供因果一致性。
在多文档事务之外"快照"
在主副本上对以下读取操作可用
所有其他读取命令都禁止 "快照"
。
操作
有关接受读取关注点的所有操作的列表,请参阅支持读取关注点的操作。
读取关注点和事务
多文档事务支持读取关注点 "snapshot"
以及 "local"
和 "majority"
.
注意
您可以在事务级别设置读取关注点,而不是在单个操作级别。要设置事务的读取关注点,请参阅 事务和读取关注点。
读取关注点和 atClusterTime
新功能在版本5.0.
在多文档事务之外,使用读取关注点 "snapshot"
的读取支持可选参数 atClusterTime
。参数 atClusterTime
允许您指定读取的时间戳。为了满足具有指定 atClusterTime
为 T 的读取请求,mongod
将根据 T 时刻可用的数据执行请求。
您可以从 db.runCommand()
的响应或从 Session()
对象中获取操作的 operationTime
或 clusterTime
。
以下命令执行带有读取关注点 "snapshot"
的 find 操作,并指定操作应从集群时间 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"
的读取操作,则返回的多数已提交数据可能是过时的。在因果一致会话 causally consistent sessions 中无法指定
atClusterTime
。
带固定集合的读取关注
从 MongoDB 8.0 开始,您可以在 带固定 集合上使用读取关注 "snapshot"
。