参考 > MongoDB CRUD操作 > 书面确认(关注)
写关注描述了MongoDB请求对独立mongod
或副本集或分片群集进行写操作的确认级别。在分片群集中,mongos
实例会将写关注事项传递给分片。
注意
对于多文档事务,可以在事务级别而不是在单个操作级别设置写关注。不要为事务中的各个写操作明确设置写关注点。
写关注点可以包括以下字段:
mongod
实例或mongod
具有指定标签的实例。w
选项¶该w
选项请求确认写操作已传播到指定数量的mongod
实例或
mongod
具有指定标签的实例。
使用该w
选项,可以使用以下写入问题:w: <value>
值 | 描述 |
---|---|
|
请求确认写入操作已传播到指定数量的
|
|
请求确认写入操作已传播到所计算的大多数带有数据的投票成员(即具有的 例如,考虑一个具有3个投票成员的副本集,即Primary-Secondary-Secondary(PSS)。对于此副本集, 计算出的多数为2,并且写入必须传播到主要对象和一个辅助对象,以向客户端确认写入问题。 在写操作返回确认消息给客户端之后,客户端可以使用readConcern 读取该写操作的结果
。 |
|
请求确认写操作已传播到 有关示例,请参阅“ 自定义多数据中心写入问题”。 |
也可以看看
j
选项¶该j
选项要求MongoDB确认已将写操作写入磁盘日志中。
|
如果为,则请求确认w:<value>中指定的
实例已写入磁盘日志中。本身并不能保证不会因副本集主故障转移而回滚写操作。 |
注意
j: true
mongod
w:
"majority"
j: true
writeConcernMajorityJournalDefault
wtimeout
¶此选项指定写关注的时间限制(以毫秒为单位)。wtimeout
仅适用于w
大于的值
1
。
wtimeout
即使要求的写操作最终会成功,也会导致写操作在指定的限制之后返回错误并返回错误。当这些写入操作返回时,MongoDB 不会撤消在写入关注超出wtimeout
时间限制之前成功执行的数据修改。
如果您未指定该wtimeout
选项并且无法实现写关注级别,则写操作将无限期阻塞。指定wtimeout
值0
等同于不带wtimeout
选项的写关注。
独立mongod
应用程序在应用了内存中的写入之后或写入磁盘日志后会确认写入操作。下表列出了独立服务器的确认行为以及相关的写入问题:
j 未指定 |
j:true |
j:false |
|
---|---|---|---|
w: 1 |
在记忆中 | 磁盘日志 | 在记忆中 |
w: "majority" |
磁盘日志(如果与日志一起运行) | 磁盘日志 | 在记忆中 |
注意
随着writeConcernMajorityJournalDefault
设置为false
,MongoDB的不等待
写入承认写之前被写入到磁盘上的日志。这样,在给定副本集中的大多数节点发生瞬时丢失(例如崩溃和重新启动)的情况下,写操作可能会回滚。w: "majority"
majority
指定给w的值确定了返回成功之前必须确认写入的副本集成员的数量。对于每个合格的副本集成员,j 选项确定成员是在内存中应用写操作之后还是在写入磁盘日志后确认是写确认。
w: "majority"
副本集的任何带有数据的投票成员都可以有助于"majority"
写操作的写确认。
下表列出了成员何时可以基于j值确认写入:
j 未指定 |
确认取决于以下值
|
---|---|
j: true |
确认需要将操作写入磁盘日志。 |
j: false |
确认需要在内存中进行写操作。 |
注意
随着writeConcernMajorityJournalDefault
设置为false
,MongoDB的不等待
写入承认写之前被写入到磁盘上的日志。这样,在给定副本集中的大多数节点发生瞬时丢失(例如崩溃和重新启动)的情况下,写操作可能会回滚。w: "majority"
majority
w: <number>
副本集的任何承载数据的成员都可以有助于w:<number>写操作的写确认。
下表列出了成员何时可以基于j值确认写入:
j 未指定 |
确认需要在存储器()中进行写操作。j: false |
---|---|
j: true |
确认需要将操作写入磁盘日志。 |
j: false |
确认需要在内存中进行写操作。 |
小费
从版本4.2.1开始,rs.status()
返回writeMajorityCount
包含计算出的多数数的
字段。
写入关注的多数"majority"
由以下值中的较小者计算得出:
警告
如果计算出的多数数等于所有带有数据的有投票权的成员的人数(例如,由3个成员组成的主要-次要仲裁员部署),则写关注
"majority"
可能会超时,或者如果有数据的有投票权的成员永远不会得到承认掉线或无法到达。如果可能,请使用带有数据的投票成员而不是仲裁者。
例如,考虑:
副本集包含3个投票成员,主要-次要(PSS):
"majority"
以向客户端确认写入问题。副本集包含3个有投票权的成员,主要-次要仲裁员(PSA)
"majority"
以向客户端确认写问题。小费
避免将"majority"
写入关注与(PSA)或其他要求使用所有承载数据的投票成员才能确认写入的拓扑配合使用。希望使用"majority"
写关注的持久性保证的客户
应改用不要求所有具有数据投票权的成员都可用的拓扑(例如PSS)。