write-concern

写入关注描述了 mongodb 为编写操作而请求的对独立的 mongod 或副本集或共享群集的确认级别。

在分片集群中, mongos 实例会将写入关注传递给分片。

注意

对于多文档事务, 可以在事务级别而不是在单个操作级别设置写入关注项。

不要明确设置事务中单个写入操作的写入关注。

Write Concern Specification

写入关注可以包括以下字段:

{ w: <value>, j: <boolean>, wtimeout: <number> }

w 选项, 请求确认写入操作已传播到指定数量的单神实例或具有指定标记的单神实例。

j 选项请求确认写入操作已写入磁盘日志, 并且

选项来指定一个时间限制, 以防止写入操作无限期地阻塞。

w 选项

w 选项请求确认写入操作已传播到指定数量的 mongod k 实例或具有指定标记的 mongod k 实例。

使用 w 选项, 可以使用以下 w: <value> 写问题:

<number>

请求确认写入操作已传播到指定数量的 mongod 主义实例。例如:

w:1

请求确认写入操作已传播到独立的 mongod 或副本集中的主服务器。w:1 是 mongodb 的默认写入问题。

w:0

请求不确认写入操作。但是, w:0 可能会将有关套接字异常和网络错误的信息返回到应用程序。

如果指定了 w:0, 但包括 j: true, 则 j: true 将优先于请求独立的 mongod 或副本集的主服务器的确认。

w 大于1需要从主和尽可能多的额外的数据轴承辅助设备进行确认, 以满足指定的写入问题。

例如, 考虑没有仲裁器的3成员副本集。指定 w: 2 需要从主和其中一个辅助程序进行确认。

指定 w:3 需要从主服务器和两个辅助服务器进行确认。

注意

隐藏、延迟和优先级0成员可以确认 w: <number> 写入操作。

延迟的辅助服务器返回写确认的时间不能早于配置的 slave 滞后。

“majority”

请求确认写入操作已传播到大多数具有数据的投票成员 (即成员 [n]. 投票大于 0, 成员 [n]. arbiter4交给 false)。

例如, 考虑具有3个具有数据的投票成员的副本集。

“多数” 写关心需要确认从三分之二的成员, 特别是主要和一个次要成员。

如果以后将副本集缩放为5个具有数据的投票成员, 则 “多数” 需要5个成员中的3个成员确认。具体而言, 主要和两个辅助。

注意

隐藏、延迟和优先级0成员的成员 [n]. 票数大于0可以确认 “多数” 写入操作。

延迟的辅助服务器返回写确认的时间不能早于配置的 slave滞后。

写入操作返回到客户端的 w: “majority” 确认后, 客户端可以读取写入的结果与 “majority” 读取 。

请求确认写入操作已传播到具有指定标记的副本集成员。

请参阅当 mongod 主义实例确认写入时的确认行为。

j 选项

j 选项请求 mongodb 确认写入操作已写入磁盘日志。

J

如果 j: true, 则请求确认 mon不以为然实例 (如 w: <value> 中指定的) 已写入磁盘日志. j: true 本身并不保证由于副本集主故障转移而不会回滚写入。

在3.2 版中更改: 与 j: true, mongodb 返回, 只有在请求的成员数量 (包括主要成员) 写入日志后。

以前 j: 副本集中的真正写入关注只需要主写入日志, 而不考虑 w: <value> 写入关注。

注意

指定包含 j: true 的写关注 (true true, 而不是在没有日志记录的情况下运行的 mongod 实例) 会产生错误。

如果启用了日记功能, w: “多数” 可能意味着 j: true。

默认副本集配置设置确定行为。有关详细信息, 请参阅确认行为。

wtimeout

此选项指定写入问题的时间限制 (以毫秒为单位)。

超时仅适用于大于1的 w 值。

wtimeout 会导致写入操作在指定的限制后返回, 并出现错误, 即使所需的写入问题最终会成功。

当这些写入操作返回时, mongodb 不会撤消在写入问题超过超时时间限制之前执行的成功数据修改。

如果未指定 wtimeout 计划选项, 并且无法实现写入问题的级别, 则写入操作将无限期地阻止。

指定 wtimeout 则值为0等效于不使用 wtimeout 则选项的写入问题。

确认行为

w 选项和 j 选项确定 mongod 实例何时确认写入操作。

独立

独立的 mongod 在内存中应用写入操作或写入磁盘日志后确认写入操作。

下表列出了独立的确认行为和相关的写入问题:

                j is unspecified	                        j:true	            j:false
w: 1	        In memory	                                On-disk journal	    In memory
w: "majority"	On-disk journal if running with journaling	On-disk journal	    In memory

注意

在编写本组织的情况下, mongodb 不会等待 w: "majority" 写入磁盘, 然后再确认写入。

因此, 在给定副本集中的大多数节点暂时丢失 (例如崩溃和重新启动) 的情况下, 大多数写入操作可能会回滚。

副本集

指定给 w 的值确定在返回成功之前必须确认写入的副本集成员的数量。

对于每个符合条件的副本集成员, j 选项确定该成员是在内存中应用写入操作后还是在写入磁盘日志后确认写入。

w: “majority”

副本集的任何具有数据的投票成员都可以帮助写入 “majority” 写入操作的确认。

下表列出了成员何时可以根据 j 值确认写入:

j 未指定的确认

取决于写作的价值:

如果为 true, 则确认需要将操作写入磁盘日志 (j: true)。

默认为 true

如果为 false, 则确认需要在内存中写入操作 (j: false)。

j: true

确认需要将操作写入磁盘日志。

j: false

确认需要在内存中写入操作。

注意

在编写本组织的情况下, mongodb 不会等待 w: “majority” 写入磁盘, 然后再确认写入。

因此, 在给定副本集中的大多数节点暂时丢失 (例如崩溃和重新启动) 的情况下, 大多数写入操作可能会回滚。

注意

隐藏、延迟和优先级0成员的 members[n].votes 大于0可以确认 “多数” 写入操作。

延迟的辅助服务器返回写确认的时间不能早于配置的 slaveDelay。

w:

w: <number>

副本集的任何数据承载成员都有助于写入 w: <number> 写入操作。

下表列出了成员何时可以根据 j 值确认写入:

j is unspecified

确认需要在内存中写入操作 (j: false)。

j: true

确认需要将操作写入磁盘日志。

j: false

确认需要在内存中写入操作。

注意

隐藏、延迟和优先级0成员可以确认 w: <number> 写入操作。

延迟的辅助服务器返回写确认的时间不能早于配置的 slaveDelay。

参考资料

read-concern