首页/数据/NoSQL 速查/写关注 writeConcern 语义
MongoDB99 条

写关注 writeConcern 语义

writeConcern 决定写入确认强度:w:1 主节点确认、w:"majority" 多数确认、j:true 等待日志落盘;按业务容忍度选择。

NoSQL 速查数据更新于 2026-10-13

写关注决定确认强度

writeConcern 回答一个问题:写入返回成功时,数据到底落到了几个节点、有没有落盘。w:1 表示主节点确认即返回,最快但主节点故障时可能丢最近写入;w:"majority" 要多数节点确认,安全性高但延迟更大;j:true 要求日志落盘。写入确认强度与业务容忍度要匹配,通常由默认值统一设定,个别敏感集合单独加固。

基本信息

w0 不等待确认 / 1 主节点确认 / majority 多数节点确认 / 数字为指定节点数
jtrue 表示等待日志落盘后再确认
wtimeout等待确认的超时毫秒数,仅对 w>1 有意义
默认值可在副本集配置的 settings.getLastErrorDefaults 中设定全局默认
按操作覆盖insertOne/updateMany 等操作的选项里可单独指定
与读一致性需要「写后立刻读到」时可结合多数派写与因果一致的会话

典型使用场景

  • 日志与埋点:容忍少量丢失,用较低的 w 换取写入吞吐
  • 订单与资金:用 majority 加日志落盘,确保确认即持久
  • 跨机房部署:评估多数派落点位置,避免写延迟被网络往返放大
  • 批量导入:临时降低确认强度提升速度,导入后再校验数据
  • 写后立即读:配合会话与读关注,保证读到自己的写入

示例

示例
// 单条写入:多数派确认并等待日志落盘,适合对数据安全性敏感的场景
db.orders.insertOne(
  { sku: "C-1", qty: 1 },
  { writeConcern: { w: "majority", j: true, wtimeout: 5000 } }
)

// 批量写入:确认强度同样可以在操作级覆盖
db.orders.bulkWrite(ops, { ordered: false, writeConcern: { w: "majority" } })

// 查看副本集当前的默认写关注配置
rs.conf().settings.getLastErrorDefaults

// wtimeout 触发后返回错误,但写入可能已经成功:重试前先按业务主键确认状态

w 取值读法

取值确认范围适用与代价
0不等待确认吞吐最高,出错无反馈,仅适合可容忍丢失的数据
1主节点内存确认默认级别,主节点故障存在丢最近写入的可能
majority多数投票成员确认安全性与延迟的平衡点,跨机房部署时延迟上升
指定数字指定数量节点确认按拓扑定制,节点数变化时需要同步调整
自定义标签按标签定义的节点集合确认适合表达「写入指定机房」这类业务语义
确认强度与延迟直接相关:跨数据中心的多数派写入要等网络往返,评估拓扑时把机房布局与超时设置一起考虑,而不是只调大 w。
wtimeout 超时返回错误不代表写入失败:确认还没到不代表操作没执行,直接重试可能产生重复数据,需要幂等设计。

易错点

  • 把 wtimeout 错误当成写入失败直接重试:实际可能已写入成功,重复提交造成数据重复
  • 全库统一用最低确认强度:日志类数据无所谓,订单与资金类一旦丢失无法补齐
  • 跨机房拓扑下盲目使用 majority:确认需要跨机房往返,写延迟上升却被当成服务端性能问题排查
  • 批量导入时临时降低确认强度却不做事后校验:导入中断时无法判断哪些数据真正落库

数据来源与参考

  • MongoDB Manual: Write Concern
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌