本文翻译自 write concern。
注意,本文内容适用于MongoDB Manual 3.0.2及以上版本。mongodb
所谓的写关注就是当向客户端报告写操做的成功执行时,MongoDB提供的保证。经过提供不一样级别的写关注来解决应用的具体需求。shell
mongo shell和MongoDB驱动使用acknowledged做为默认写关注级别。数据库
注:读与写如何隔离?写与写如何隔离?网络
在将这些修改提交至磁盘以前,MongoDB容许客户端读取刚插入或修改的文档,无论写关注的级别或日志(journaling)配置。其结果是,应用能够观察到两类行为:并发
其余数据库系统称这些 隔离语义(isolation semantics) 为read uncommitted。对于全部的插入和更新,MongoDB以隔离方式修改每个文档:客户端从不会看到中间状态的文档。对于多文档操做来讲,MongoDB并未提供多文档事物或隔离。ide
当以单机方式(standalone)方式部署的mongod从使用journaled写关注的写操做中返回时,数据就彻底提交至磁盘了,重启mongod后它们就可用了。spa
对于副本集,只有在 在副本集的大部分投票节点上写操做被复制且提交数据至日志 以后,写操做才是持久的。MongoDB会按期(regularly)提交数据至日志,无论journaled写关注:使用commitIntervalMs去控制mongod多长时间提交一次数据。翻译
客户端能够设置一个wtimeout值,做为replica acknowledged写关注的一部分。若是在指定的时间间隔内写关注未被知足,当前操做就会返回错误,即便写关注最终成功完成。日志
在wtimeout间隔过时以前,MongoDB不会回滚或撤消已作出的修改。进程
MongoDB有下面这些概念性的写关注等级,由弱到强:
(注:下面这些只是逻辑概念上的写关注级别,并不是配置write concern时恰好有这几个配置枚举值可选。实际上写关注包含两个方面,分别对应两个配置项:w和j,须要组合这两个配置项来实现下面这些写关注级别。具体请看Write Concern Reference。)
MongoDB不会告知客户端写操做已收到。unacknowledged相似于error ignored。然而,驱动程序在可能的时候会试图接收并处理网络错误。但驱动检测网络错误的能力有赖于系统的网络设置。
在Default Write Concern Change勾画出的发布(注:此版本已发布于2012.11)以前,unacknowledged就是默认写关注。
acknowledged 也叫 receipt acknowledged。mongod会告知客户端已收到写操做,而且已将改变应用于数据的内存视图。acknowledged 写关注(write concern)容许客户端捕获网络(network)、重复键(duplicate key)和其余错误。但acknowledged 写关注并不会确认写操做已经被持久化到磁盘系统。
从Default Write Concern Change勾画出的驱动发布(注:此版本已发布于2012.11)开始,MongoDB将默认使用acknowledged写关注。
MongoDB仅在将数据提交到journal后才告知客户端。(告知客户端什么信息呢?)这种写关注会确保在关机或电力中断后MongoDB可以恢复数据。
你必须启用journaling以使用这种写关注。
使用这种写关注,写操做必须等到下一第二天志提交(journal commit)才能返回。为了下降操做延迟,MongoDB也增长了它提交数据至日志(journal)的频率。参考commitIntervalMs文档以获取更多信息。
注意:
若是在副本集中须要journaled写关注,只须要写操做在主节点上完成日志提交就好了,不用考虑replica acknowledged写关注。(journaled写关注只是一种逻辑上的写关注级别,实际并无这个配置项值,组合w和j两个配置项才能实现用户指望的写关注。)
关于写关注,副本集(relica set)提出了额外的考虑因素。默认写关注仅要求来自主节点(the primary)的确认(acknowledgement)。
使用这种写关注,你可以确保写操做被传播至副本集中的额外成员,即部分从节点(the secondary)。参考**Write Concern for Replica Sets **文档以获取更多信息。
注意:
若是在副本集中须要journaled写关注,只须要写操做在主节点上完成日志提交就好了,不用考虑replica acknowledged写关注。(journaled写关注只是一种逻辑上的写关注级别,实际并无这个配置项值,组合w和j两个配置项才能实现用户指望的写关注。)