Skip to content

写关注

写关注(Writes Concern) 是 MongoDB 用来确认写入操作是否成功的机制。通过设置不同的写关注级别,您可以控制数据在副本集中的传播程度。

基本语法

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

主要参数

w 参数 - 确认数量

控制写入操作需要得到多少个节点的确认:

  • { w: 1 } - 至少需要主节点确认 (默认值)
  • { w: 0 } - 无需确认,快速写入但不保证持久化
  • { w: "majority" } - 需要大多数节点确认 (推荐用于高可用)
  • { w: 2 } - 需要 2 个节点确认 (副本集中)

j 参数 - 日志确认

控制写入是否需要记录到磁盘日志:

  • { j: true } - 必须写入磁盘日志后才算确认
  • { j: false } - 无需等待磁盘日志 (默认值)

wtimeout 参数 - 超时时间

设定等待确认的最长时间(毫秒),防止永久阻塞:

  • { wtimeout: 5000 } - 等待 5 秒后超时
  • 不设置时会无限期等待

使用示例

应用到查询操作

// 插入时指定写关注
db.collection.insertOne({ x: 1 }, { writeConcern: { w: "majority", j: true } });

// 更新时指定写关注
db.collection.updateOne(
  { _id: 1 },
  { $set: { x: 2 } },
  { writeConcern: { w: "majority" } },
);

// 删除时指定写关注
db.collection.deleteOne({ _id: 1 }, { writeConcern: { wtimeout: 1000 } });

选择建议

生产环境推荐配置

对于要求高可靠性的场景:

{ w: "majority", j: true }

对于追求性能但需要基本可靠的场景:

{
  w: "majority";
}

不同场景下的配置

场景 配置 说明
日常业务数据 { w: "majority" } 保证数据在大多数节点上持久化
重要财务数据 { w: "majority", j: true } 保证数据持久化并写入日志
高速缓存 { w: 1 } 只需主节点确认即可
可丢弃日志 { w: 0 } 发送后不用等待确认

注意事项

  1. 副本集中至少需要多数节点正常工作,{ w: "majority" } 才能成功
  2. 未确认的写入操作可能因为节点故障而回滚
  3. 设置 j: true 会影响写入性能,因为它需要同步磁盘
  4. wtimeout 防止操作无限期阻塞,但超时不等于写入失败
  5. 在事务中应在事务级别设置写关注,而不是单个操作级别