1. 写事务

1.1 什么是 writeConcern ?

writeConcern 决定一个写操作落到多少个节点上才算成功。writeConcern 的取值包括:

发起写操作的程序将阻塞到写操作到达指定的节点数为止。

注意:

默认MongoDB所谓的“写入成功”指写入到节点内存即算成功,无需等待数据真实写入硬盘(落盘)。

journal则定义如何才算成功:

writeConcern 设置代码格式如下:

{
  writeConcern:{w:"majority",j:true,wtimeout:3000}
}

<aside> 💡

注意事项

  1. 虽然多于半数的 writeConcern 都是安全的,但通常只会设置 majority,因为这是等待写入延迟时间最短的选择。
  2. 不要设置 writeConcern 等于总节点数,因为一旦有一个节点故障,所有写操作都将失败。
  3. writeConcern 虽然会增加些操作的延迟时间,但并不会显著增加集群压力,因此无论是否等待,写操作最终都会复制到所有节点上。设置 writeConcern 只是让写操作等待复制后再返回而已。
  4. 应对重要数据,应使用 {w:“majority”},普通数据可以应用{w:1} 以确保最佳性能。 </aside>

2. 读数据

在读取数据的过程中,我们需要关注以下两个问题:

  1. 从哪里读? 关注数据节点位置
  2. 什么样的数据可以读?关注数据的隔离性

第一个问题是由 readPreference 来解决。

第二个问题是由 readConcern 来解决。