MongoDB Academy · 课时

写关注和已确认的持久性

您将配置 w:majority、w:1 和日志记录选项,以调整写入操作的持久性保证。

第 3 / 4 课13 个步骤

写关注和已确认的持久性 是 CoddyKit 上的免费 MongoDB Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 MongoDB Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 MongoDB Academy 课程共包含 4 节课。

什么是写关注?

写关注用于告诉 MongoDB,在驱动程序认为写入成功之前,必须有多少个副本集成员确认该写入。它是权衡持久性(确认数越多越安全)与延迟(确认数越少越快)的主要参数。每个写入操作——插入、更新、删除或替换——都可以指定自己的写关注。

w 选项:计算确认数

w 字段控制必须确认写入的成员数量。w: 0 表示发出后即忘(完全不等待确认)。w: 1(默认值)表示只需主节点确认。w: 2 表示主节点加一个从节点。w: 'majority' 是生产环境推荐的设置——它会等待多数投票成员确认。

// w:1 — only primary acknowledges (default)
db.orders.insertOne({ item: 'pen' }, { writeConcern: { w: 1 } })

// w:majority — safe for production
db.orders.insertOne({ item: 'pen' }, { writeConcern: { w: 'majority' } })

w: majority——推荐设置

w: 'majority' 可确保写入已复制到多数投票成员后,驱动程序才会收到成功响应。这意味着即使发生故障转移,新选出的主节点也一定已经看到该写入。它是唯一能防止主节点故障时数据回滚的设置。

// Set default write concern at the database level
db.runCommand({
  setDefaultRWConcern: 1,
  defaultWriteConcern: { w: 'majority', wtimeout: 5000 }
})

j 选项:日志持久性

j(日志)选项控制 MongoDB 在确认写入前是否等待写入提交到磁盘日志。使用 j: true 时,即使服务器在确认后立即崩溃,也不会丢失该写入。不使用日志记录(j: false)时,如果在内存写入与下一次日志刷新之间发生崩溃,操作可能会丢失。

// Fully durable write: majority replication + journaled
db.payments.insertOne(
  { amount: 499.99, currency: 'USD' },
  { writeConcern: { w: 'majority', j: true, wtimeout: 5000 } }
)

wtimeout 选项

wtimeout 设置服务器等待所需 w 个确认的最长时间(以毫秒为单位)。如果在规定时间内未达到该阈值,MongoDB 会返回 WriteConcernError——但写入仍已在主节点上完成。超时表示复制延迟,而不是写入失败。

// Timeout after 3 seconds if secondaries are slow
db.logs.insertOne(
  { event: 'login', userId: 'u123' },
  { writeConcern: { w: 'majority', wtimeout: 3000 } }
)

w:0 发出后即忘:何时使用

w: 0 会发送写入并立即返回,不等待任何确认。对于遥测、分析事件或日志摄取等高流量且可容忍数据丢失的工作负载,这可以最大化吞吐量。请勿将其用于金融交易、用户生成内容,或任何不能承受丢失的数据。

// High-throughput metrics logging — loss acceptable
await db.collection('metrics').insertMany(
  readings,
  { writeConcern: { w: 0 } }
)

写关注与回滚

当主节点发生故障、某个从节点成为主节点时,旧主节点尚未复制到多数成员的任何写入都会被回滚。这些已回滚的写入会保存到磁盘上的回滚文件夹中,以便手动恢复。使用 w: 'majority' 可以消除这一风险,因为只有多数成员都拥有该写入后,系统才会确认它。

将写关注与事务结合使用

在多文档事务中,写关注应用于提交步骤,而不是事务内部的单个操作。使用 w: 'majority' 提交,可确保事务中的所有写入都已持久化到多数成员后,应用程序才继续执行。事务内部针对单个操作设置的写关注会被忽略。

const session = client.startSession()
await session.withTransaction(async () => {
  await orders.insertOne({ item: 'book' }, { session })
  await inventory.updateOne({ _id: 1 }, { $inc: { qty: -1 } }, { session })
}, { writeConcern: { w: 'majority' } })

MongoDB 5+ 中的默认写关注

从 MongoDB 5.0 开始,副本集和分片集群的隐式默认写关注为 w: 'majority'。在 5.0 之前,默认值为 w: 1。这意味着现代 MongoDB 部署默认就很安全,但为了清晰性和可移植性,您仍应在关键应用程序代码中显式设置写关注。

// Verify the current default write concern
db.adminCommand({ getDefaultRWConcern: 1 })
// { defaultWriteConcern: { w: 'majority' }, ... }

客户端级别的写关注

写关注可以在三个级别设置:操作级别(针对每次插入或更新)、集合级别(获取集合句柄时),或客户端/连接字符串级别。更具体的级别会覆盖更宽泛的级别。在客户端级别设置后,默认会应用于所有操作;而操作级别的设置最适合需要特殊持久性保证的情况。

// Set write concern at MongoClient level
const client = new MongoClient(uri, {
  writeConcern: { w: 'majority', j: true, wtimeout: 5000 }
})

// Override per-operation when needed
await db.criticalData.insertOne(doc, { writeConcern: { w: 3 } })

选择合适的写关注

请根据数据的重要程度选择写关注。金融/事务数据:w: 'majority', j: true。用户内容:w: 'majority'。会话/缓存数据:w: 1。高流量遥测数据:w: 0。正确的选择需要权衡数据丢失的代价与等待额外确认所带来的延迟成本。

快速检查

测试您对本课 MongoDB 和 NoSQL 数据库概念的理解。

课程回顾

在本课中,您了解到:写关注 w 控制必须确认写入的成员数量,w: 'majority' 是生产环境推荐的设置,可防止故障转移后的回滚,以及j: true 为磁盘日志增加持久性,确保发生崩溃时数据安全。接下来,我们将探索读取偏好,以及如何在副本集之间分配读取负载。

免费开始

用 AI 导师学习 JavaScript — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
30
课程
120

常见问题解答

「写关注和已确认的持久性」课时是免费的吗?

是的 — 「写关注和已确认的持久性」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 MongoDB Academy 课程的其余内容,请升级到 CoddyKit PRO。 MongoDB Academy 课程共包含 4 节课。

「写关注和已确认的持久性」这节课中我会学到什么?

您将配置 w:majority、w:1 和日志记录选项,以调整写入操作的持久性保证。 你通过在浏览器中直接运行的动手代码来练习 MongoDB Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 MongoDB Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 MongoDB Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「写关注和已确认的持久性」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 MongoDB Academy 课中编写并运行代码吗?

能。每节 MongoDB Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 副本集成员:主节点、从节点和仲裁者
  2. 选举和自动故障转移
  3. 写关注和已确认的持久性
  4. 读取偏好:分配读取负载
← 返回 MongoDB Academy