参考 > MongoDB CRUD操作 > 读取隔离(关注读取) > 阅读关注 "linearizable"
3.4版的新功能。
该查询返回的数据反映了在读取操作开始之前完成的所有成功的多数确认写入。查询可能会等待并发执行的写操作传播到大多数副本集成员,然后返回结果。
如果大多数副本集成员崩溃并在读取操作后重新启动,则如果writeConcernMajorityJournalDefault
将其设置为默认状态,则读取操作返回的文档将是持久
的true
。
随着writeConcernMajorityJournalDefault
设置为false
,MongoDB的不等待
写入承认写之前被写入到磁盘上的日志。这样,在给定副本集中的大多数节点发生瞬时丢失(例如崩溃和重新启动)的情况下,写操作可能会回滚。w: "majority"
majority
您可以primary
仅对读取操作指定线性化读取关注。
可线性化读取关注保证仅在读取操作指定唯一标识单个文档的查询过滤器时适用。
小费
maxTimeMS
万一大多数数据承载成员不可用,请始终与可线性化的读取注意事项一起使用。maxTimeMS
确保操作不会无限期地阻塞,而是确保如果无法满足读取要求,则该操作将返回错误。
读关注linearizable
不适用于因果一致的会话。
您不能将$out
或$merge
阶段与阅读关注结合使用"linearizable"
。也就是说,如果您为指定了"linearizable"
读取关注
db.collection.aggregate()
,则不能在管道中包括任何一个阶段。
结合"majority"
写关注,
"linearizable"
读关注使多个线程可以在单个文档上执行读写操作,就好像单个线程实时执行了这些操作一样。也就是说,这些读写的相应计划被认为是线性的。
在版本3.6中更改。
从MongoDB 3.6开始,如果写入请求确认,则可以使用因果一致的会话来读取自己的写入。
在MongoDB 3.6之前,您必须发出具有写入关注点的写入操作,
然后
对读取操作使用或关注读取,以确保单个线程可以读取自己的写入。{ w: "majority" }
"majority"
"linearizable"
不同于"majority"
,"linearizable"
关注对象会与辅助成员确认读操作正在从主要对象进行读取,该操作能够确认具有
写关注对象的写入。
[1]因此,具有线性化读关注度的读取可能比具有或读关注度的读取慢得多
。{ w: "majority" }
"majority"
"local"
maxTimeMS
万一大多数数据承载成员不可用,请始终与可线性化的读取注意事项一起使用。maxTimeMS
确保操作不会无限期地阻塞,而是确保如果无法满足读取要求,则该操作将返回错误。
例如:
[1] | 在某些情况下,副本集中的两个节点可能会短暂地认为它们是主要节点,但至多,其中一个节点将能够完成写操作而无需担心。可以完成
写入操作的节点是当前主节点,另一个节点是以前的主节点,由于网络分区,该主节点尚未意识到其降级。发生这种情况时,尽管已请求读取首选项,但连接到前主数据库的客户端可能仍会观察到过时的数据
,并且对前主数据库的新写入最终将回滚。{ w:
"majority" } { w: "majority" } primary |