参考 > MongoDB CRUD操作 > 读取隔离(关注读取)
在本页面
该readConcern
选项使您可以控制从副本集和副本集分片读取的数据的一致性和隔离性。
通过有效使用写入关注点和读取关注点,您可以适当地调整一致性和可用性保证的级别,例如等待更强的一致性保证,或者放宽一致性要求以提供更高的可用性。
为MongoDB 3.2或更高版本更新的MongoDB驱动程序支持指定读取关注。
提供以下已读关注级别:
level |
描述 |
---|---|
"local" |
该查询从实例返回数据,但不保证该数据已被写入大多数副本集成员(即可以回滚)。
可用性: 有关更多信息,请参见 |
"available" |
该查询从实例返回数据,但不保证该数据已被写入大多数副本集成员(即可以回滚)。 默认设置为:如果读取 与因果一致的会话不相关,则针对次要对象进行读取。 可用性:阅读的关注 对于分片群集, 有关更多信息,请参见 3.6版的新功能。 |
"majority" |
该查询返回大多数副本集成员已确认的数据。读取操作返回的文档即使在发生故障的情况下也很持久。 为了满足读取关注的“多数”,副本集成员在多数提交点从其内存数据视图返回数据。这样,阅读关注
要求:要使用的关注级别
注意 对于多文档事务中的操作, 有关更多信息,请参见 |
"linearizable" |
该查询返回的数据反映了在读取操作开始之前完成的所有成功的多数确认写入。查询可能会等待并发执行的写操作传播到大多数副本集成员,然后返回结果。 如果大多数副本集成员崩溃并在读取操作后重新启动,则如果 随着
您不能将 要求:可线性化的读取关注保证仅在读取操作指定唯一标识单个文档的查询过滤器时适用。 小费
有关更多信息,请参见 |
"snapshot" |
如果事务不是因果一致的会话的一部分,则在考虑到事务提交的情况下提交
"majority" 事务时,将确保已从多数提交数据的快照中读取事务操作。如果事务是因果一致的会话的一部分,则在事务提交时,如果存在写问题
"majority" ,则可以保证事务操作已从多数提交数据的快照中读取,该快照提供了与紧接事务开始之前的操作的因果一致性。
|
无论读关注级别如何,节点上的最新数据都可能无法反映系统中数据的最新版本。
有关每个阅读关注级别的更多信息,请参见:
readConcern
支持¶对于不在多文档事务中的操作,可以将readConcern
级别指定为支持阅读关注的命令和方法的选项:
要指定mongo
shell方法的读取关注级别db.collection.find()
,请使用以下
cursor.readConcern()
方法:
对于多文档事务,可以在事务级别而不是在单个操作级别设置读取关注。事务中的操作将使用事务级别的读取关注。事务内部将忽略在集合和数据库级别设置的任何读取关注。如果显式指定了事务级别的读取关注点,则在事务内部也将忽略客户端级别的读取关注点。
重要
不要为单个操作明确设置读取关注点。要设置事务的读取关注点,请参阅 读取关注点/写入关注点/读取首选项。
您可以在事务开始时设置读取关注:
"snapshot"
,"local"
并且
"majority"
可用。如果未在事务开始时指定,则事务将使用会话级别的读取关注点;如果未设置,则使用客户端级别的读取关注点。
有关更多信息,请参见事务阅读关注。
用于因果一致的会话中的操作,"local"
并且
"majority"
级别可用。但是,为了保证因果一致性,必须使用"majority"
。有关详细信息,请参见因果一致性。
如果多文档交易与因果一致的会话相关联,"snapshot"
则该交易也可以使用。
以下操作支持阅读关注:
重要
要为事务中的操作设置读取关注,请在事务级别(而不是在单个操作级别)设置读取关注。不要为事务中的各个操作明确设置读取关注点。有关更多信息,请参见 事务和阅读关注点。
命令/方法 | "local" |
"available" |
"majority" |
"snapshot" [3] |
"linearizable" |
---|---|---|---|---|---|
count |
✓ | ✓ | ✓ | ✓ | |
distinct |
✓ | ✓ | ✓ | ✓ [2] | ✓ |
find |
✓ | ✓ | ✓ | ✓ | ✓ |
db.collection.find()
通过
cursor.readConcern() |
✓ | ✓ | ✓ | ✓ | ✓ |
geoSearch |
✓ | ✓ | ✓ | ✓ | ✓ |
getMore |
✓ | ✓ | |||
aggregate
db.collection.aggregate() |
✓ | ✓ | ✓ | ✓ | ✓ [1] |
Session.startTransaction() |
✓ | ✓ | ✓ |
[1] | 您不能将$out 或$merge 阶段与阅读关注结合使用"linearizable" 。也就是说,如果您为指定了"linearizable" 读取关注
db.collection.aggregate() ,则不能在管道中包括任何一个阶段。 |
[2] | 阅读关注"snapshot" 仅适用于多文档交易。在事务中,不能distinct 在分片集合上使用
命令或其帮助程序。 |
如果是多文档事务的一部分,则以下写操作也可以接受读问题:
重要
要为事务中的操作设置读取关注,请在事务级别(而不是在单个操作级别)设置读取关注。
命令 | "local" |
"available" |
"majority" |
"snapshot" [3] |
"linearizable" |
---|---|---|---|---|---|
✓ | ✓ | ||||
✓ | ✓ | ||||
✓ | ✓ | ||||
✓ | ✓ |
[3] | (1,2)读的关注"snapshot" 只对多文档交易可用,进行交易,可以设置在事务级别的读取问题。支持的操作
"snapshot" 对应于事务中可用的CRUD操作。有关更多信息,请参见
事务和阅读关注点。 |
在版本3.6中更改。
从MongoDB 3.6开始,如果写入请求确认,则可以使用因果一致的会话来读取自己的写入。
在MongoDB 3.6之前,您必须发出具有写入关注点的写入操作,
然后
对读取操作使用或关注读取,以确保单个线程可以读取自己的写入。{ w: "majority" }
"majority"
"linearizable"
结合"majority"
写关注,
"linearizable"
读关注使多个线程可以在单个文档上执行读写操作,就好像单个线程实时执行了这些操作一样。也就是说,这些读写的相应计划被认为是线性的。
不同于"majority"
,"linearizable"
关注对象会与辅助成员确认读操作正在从主要对象进行读取,该操作能够确认具有
写关注对象的写入。
[4]因此,具有线性化读关注度的读可能比具有或读关注度的读慢得多
。{ w: "majority" }
"majority"
"local"
maxTimeMS
万一大多数数据承载成员不可用,请始终与可线性化的读取注意事项一起使用。maxTimeMS
确保操作不会无限期地阻塞,而是确保如果无法满足读取要求,则该操作将返回错误。
例如:
[4] | 在某些情况下,副本集中的两个节点可能会短暂地认为它们是主要节点,但至多,其中一个节点将能够完成写操作而无需担心。可以完成
写入操作的节点是当前主节点,另一个节点是以前的主节点,由于网络分区,该主节点尚未意识到其降级。发生这种情况时,尽管已请求读取首选项,但连接到前主数据库的客户端可能仍会观察到过时的数据
,并且对前主数据库的新写入最终将回滚。{ w:
"majority" } { w: "majority" } primary |
afterClusterTime
¶3.6版的新功能。
MongoDB 3.6引入了对因果一致的会话的支持。对于与因果一致的会话相关联的读取操作,MongoDB 3.6引入afterClusterTime
了驱动程序自动设置与因果一致的会话相关联的操作的读取关注选项。
重要
不要手动设置afterClusterTime
读取操作。MongoDB驱动程序会针对与因果一致的会话相关联的操作自动设置此值。但是,您可以提前会话的操作时间和群集时间,以便与另一个客户端会话的操作保持一致。有关示例,请参见示例。
为了满足afterClusterTime
值为的读取请求T
,mongod
必须在其oplog到达时间后执行请求T
。如果其oplog尚未到达时间T
,则
mongod
必须等待服务请求。
具有指定afterClusterTime
返回数据的读取操作同时满足读取关注级别
要求和指定afterClusterTime
要求。
对于与因果一致会话无关的读取操作,未
afterClusterTime
设置。