读关注 (read concern) "snapshot"
5.0 版本中的更改。
具有读关注(read concern)"snapshot"
的查询会返回最近某个特定时间点跨分片出现的多数提交数据。 仅当ACID 事务以写关注(write concern) "majority"
提交时,读关注"snapshot"
才提供ACID 一致性保证。
读关注 "snapshot"
可用于多文档事务,以及从 MongoDB 5.0 开始,多文档事务之外的某些读取操作。
如果事务不是因果一致会话的一部分,则在以写关注
"majority"
提交事务时,保证已从多数提交数据的快照中读取事务操作。如果事务是因果一致会话的一部分,则在以写关注
"majority"
提交事务后,保证事务操作从多数提交数据的快照中读取,该快照与事务开始前立即执行的操作具有因果一致性。
在多文档事务之外,读关注 "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
。
针对固定大小集合的读关注
从版本 5.0 开始,读取固定大小集合时不能使用读关注 "snapshot"
。