MongoDB 的写操作事务| 8月更文挑战

237 阅读2分钟

这是我参与8月更文挑战的第1天,活动详情查看:8月更文挑战

MongoDB 中的写操作事务,主要涉及到写入数据指令中的 writeConcern 参数。这个参数决定了写操作如何才算成功。

用法如下:

db.test.insert( {count: 1}, {writeConcern: {w: "majority"}})

w

在 writeConcern 参数中,w 的值代表写操作需要落在几个节点上才算成功。它的可选值包括:

  • 0:发起写操作,不关心是否成功。
  • 1 ~ 集群最大节点数:写操作需要被复制到指定的节点数,才算成功。
  • majority:写操作需要被复制到大多数节点上才算成功。
  • all:写操作需要被复制到所有节点上才算成功。

w 的默认值是 1,也就是说,默认情况下,写操作之需要在一个节点执行成功,就会被视为写入成功。但是为了数据的安全性,推荐大部分场景下将这个值设置为 majority

j

writeConcern 还包含一个 j 参数,有 true / false 两个值,分别代表如下含义:

  • true:写操作落到 journal 文件中才算成功。
  • false:写操作到达内存即算作成功。

journal 文件可以用来在 crash 之后做恢复,且 j 的默认值为 true,所以,大部分场景下,不需要指定 w 的值。保持默认即可。

timeout

writeConcern 的第三个常用的参数是 timeout,用于指定写入超时的时间。

为什么需要这个参数呢?因为发起写操作后,会阻塞到写操作到达指定的节点数为止,指定超时时间可以在极端情况下避免程序阻塞太长时间。

基于写操作会阻塞这一特性,还有两个需要注意的地方:

  1. 虽然把 w 参数设置成不低于 mojority 的值都是安全的,但是,依然建议直接把值设置为 majority,这样可以把安全写入的等待时间控制在最短。
  2. 不要把 w 的值设置为总节点数,因为一旦有一个节点出现故障,所有的写操作都会失败,增加了系统的脆弱性。