写关注
写关注描述一个写操作是否成功的报告时的MongoDB提供的保证。写关注的强度决定了保证的级别。当插入,更新和删除有一个弱的写关注,写操作的返回是很快的。在一些失败的例子中,用弱的写关注发出的写操作可能无法持久。用强的写关注,发送一个写操作到MongoDB后客户端等待确定这个写操作。
MongoDB中提供了不同级别的写关注,以更好地满足应用的特定需求。客户端可以通过调整写关注,以确保最重要的操作成功地持续到整个MongoDB的部署。对于其他不太重要的业务,客户端可以调整写关注,以确保更快的性能,而不是保证持久化到整个部署。
在版本2.6中的变化:对于写操作的新协议,集成了写操作写关注。
关于写关注配置的详细信息,请参阅写关注参考。
一、注意事项
默认写关注
mongo命令行和MongoDB驱动使用Acknowledged做为默认的写关注。
查看Ackowledged的更多信息,以及这个写关注成为默认。
读隔离
MongoDB允许客户端在提交插入修改到磁盘之前读取插入或修改的文档。不管写关注级别或日记配置。作为默认,应用程序可能会发现两类行为:
对于有多个并发读和写的系统,MongoDB将允许客户端读取写操作返回之前写操作的结果。
如果mongod在日志提交之前终止,即使写成功返回。查询可能已经读过了mong的重新启动后不存在数据。
其他数据库系统指这些隔离语义为已读未提交。对于所有的插入和更新,MongoDB修改每个在隔离中的文档:客户从来没有看到在中间状态的文件。对于多文档操作,MongoDB不提供任何多文档记录或隔离。
当mongod返回一个成功的日记写关注,该数据已完全提交到磁盘,mongod重新启动后是前效的。
对于副本集,写操作是耐用后才写复制和承诺多数集合的成员的日记。写操作仅在一个写副本集并提交到大多数集合的成员的日记之后是持久的。MongoDB的期提交数据到日志不论日志写关注:使用commitIntervalMs来控制一个mongod如何经常的提交日志。
二、写关注强度
MongoDB具有以下概念性写关注的强度,从弱到强排列:
未确认
用未确认的写关注,MongoDB不保证收到写操作。未确认的是类似于忽略错误;无论如何,驱动将试图尽可能的接收和处理网络错误。驱动检测网络错误的能力取决于该系统的网络配置。
之前在默认写关注变化中列出的版本中,这是默认的写入关注。
用未确认的写关注写操作到一个mongod实例。客户端不等待任何确认。
确认
用一个接收确认的写关注,mongod确认收到的写操作。确认写关注允许客户端捕获网络,重复键,和其它错误。
MongoDB使用确认写关注做为在发布中列出的驱动程序版本启动中的默认写关注。
在2.6版本中的变化:无论交互运行或在脚本中, mongo命令行现在的写方法采用的write方法写关注,并提供了默认的写关注。更多细节查看写方法确认。
用确认的写关注写操作到一个mongod实例。客户端等待成功或异常的确认。
日志式
用一个日志式的写关注,MongoDB仅在提交数据到日志后确认写操作。这个写关注确保MongoDB中可以从关机或断电恢复数据。
您必须启用日志使用此写关注。
用日志式写关注,写操作必须等待下一个日志提交。为了为这些操作减少等待时间,MongoDB也增加了其提交操作到日志的频率。获取更多信息参考commitIntervalMs。
用日专式写关注写操作到一个mongod实例。当提交写操作到日志后mongod发送确认。
注意:在一个副本集中请求日志写关注仅请求写操作的一个日志提交到集群的主,不管副本确认写关注的强度。
副本确认
关于写关注副本集目前额外的注意事项。默认写关注仅请求从主确认。
用副本集确认写关注,你能确保写操作传播到副本集的其他成员。更多信息查看副本集的写关注。
用w:2的写关注写操作到副本集或写操作到主并至少有一个从。
注意:在一个副本集中请求日志写关注仅请求写操作的一个日志提交到集群的主,不管副本确认写关注的强度。