我正在阅读MongoDB文档,其中提到了reading:MongoDB allows clients to read documents inserted or modified before it commits these modifications to disk, regardless of write concern level or journaling configuration[1]和locks:Locks help guarantee that all writes to a single document occur either in full or not at all[2]。
我的问题是,如果写操作有锁,那么为什么用户可以读取未提交的数据?
发布于 2014-11-17 11:05:17
写入首先在内存中完成,然后(异步地)刷新到磁盘.任何访问文档的读者都将立即获得内存中的副本,而不是等待刷新到磁盘(否则数据库将在性能方面受到磁盘绑定)。关于锁的引用适用于内存中的部分,并保证内存中单个操作的原子性--它要么全部发生,要么不发生,读取器没有中间状态。因此,两者并不相互冲突,但您应该知道它们是如何工作的。
如果您担心对于特定写入的磁盘持久化,那么我建议您研究一下j:true和w:majority的写关注点。前者只在写到日志(磁盘上)之后才返回true,而第二个只有在写入到大多数时才返回true (3中2,5中3,等等)。复制集的成员。请注意:与默认情况相比,这两个写关注点都会引起很大的延迟(以及j:true选项的IO增加),因此请确保它们是必需的,并且性能水平是可以接受的。
这两个选项(如您提供的链接)都不会阻止读者读取内存中已提交但未刷新到磁盘的数据,但j:true将向应用程序发出通知,如果写入失败,则写入失败,而w:majority将通知您是否已将其复制到其他成员(这将成为故障转移事件中的主要内容)。有了这些知识,您的应用程序就可以根据操作的成功/失败采取适当的操作(检查、重试、其他操作)。
https://dba.stackexchange.com/questions/82758
复制相似问题