- MongoDB CRUD 操作 >
- MongoDB CRUD 参考 >
- 安全写级别参考
安全写级别参考¶
安全写级别 保证了 MongoDB 在一个写操作成功时能给用户发报告。
在 2.6 版更改: 用于 写操作 的新协议将安全写级别与写操作结合在一起,并不需要调用 getLastError 命令。以前的版本需要在一个写操作后马上调用 getLastError 命令以指定安全写级别。
读隔离行为¶
不管安全写级别或者日志配置如何,MongoDB都允许客户端读取那些插入或者修改的文档,尽管它们还未commit到硬盘。其结果是应用可能会观测到两类行为:
对于有着读写多并发的系统来说,MongoDB 将允许客户端在一个写操作返回之前读取它的结果。
即使写操作成功返回了,如果在文档提交(commit)之前 mongod 中断了,在 mongod 重起之后,也可能查询到这些不存在的数据。
其他数据库系统将这些隔离语义定义为 脏读(read uncommitted) 。对于所有的插入和更新,MongoDB 原子地修每一个文档;客户端绝对不会遇到中间状态的文档。对于多文档操作,MongoDB 不提供任何多文档事物或隔离。
当 mongod 返回一个成功的 journaled write concern 的时候,这些数据被完全提交到硬盘上了并且在 mongod 重起之后也是可用的。
对于复制集,写操作只有在写复制集之后并且提交日志到复制集的主节点后才是持久的。无论日志的安全写级别是什么,MongoDB 定期地提交数据到日志:可以使用 commitIntervalMs 来控制 mongod 多久提交到日志一。
可用的安全写级别¶
安全写级别可以包含 w 选项以指定返回之前的确认次数,包含 j 选项需要在返回之前写到日志上,包含 wtimeout 选项指定一个时间限制以防止写操作无限期地阻塞下去。
在分片集群中, mongos 实例将把安全写级别分发给分片。
w 选项¶
w 选项可以完全禁用安全写级别, 也 可以为 :term:`replica sets <replica set>`指定安全写级别。
MongoDB 使用 w: 1 作为默认的安全写级别。 w: 1 提供基本的接收确认。
The w option accepts the following values:
值 |
描述 |
---|---|
1 | 为一个单独的 mongod 或者复制集里的 primary 提供写操作通知。 这是 MongoDB 的默认安全写级别。 |
0 | 禁用基本的写操作通知,但返回套接字异常和网络异常的信息给应用。 如果你禁用了基本的写操作通知,但是需要日志提交通知, the journal commit prevails, and the server will require that mongod acknowledge the write operation. |
大于 1 的数字 |
保证写操作已经成功的传播给包括主节点在内的指定数量的复制集。 例如, w: 2 表明来自主节点和至少一个从节点的确认。 如果你设置 w 为一个大于复制集中包含数据的成员的数字,那么 MongoDB 会等待不存在的成员变的可用,这意味着 MongoDB 将无限期的阻塞。 |
"majority" | 确认写操作已经传播给了配置的复制集的主节点:只有大部分复制集中配置的成员确认收到写操作后,它才能成功。这可以使您避免对设置到您的应用中的复制集的数量进行硬编码假设。 在 2.6 版更改: 在 Master/Slave 部署中,MongoDB 认为 w: "majority" 是与 w: 1 等价的。在 MongoDB 的更早期版本中,在 master/slave 部署期间, w: "majority" 会产生一个错误。 |
<tag set> | 通过指定 tag set ,你可以更加细粒度的控制哪一个复制集成员必须确认某个写操作,以满足需要的安全写操作级别。 |
j 选项¶
The j option confirms that the mongod instance has written the data to the on-disk journal. This ensures that data is not lost if the mongod instance shuts down unexpectedly. Set to true to enable.
在 2.6 版更改: 给指定了 --nojournal 选项的 mongod 或者 mongos 配置包含 j: true 的安全写级别现在会发生错误。以前的版本将忽略 j: true 。
注解
在复制集里需要的 journaled 安全写级别仅仅需要对复制集的 primary 节点的写操作的日志提交,而忽略 replica acknowledged 安全写级的等级。
wtimeout¶
这个选项为安全写级别指定一个时间限制,以毫秒为单位。 wtimeout 仅仅适用于 w 的大于 1 的值。
超过指定的限制之后, wtimeout 会造成写操作返回并且发生错误,即使所需要的安全写级别还没有完成。当这些写操作返的时候,MongoDB 不会 撤销安全写级别在超出 wtimeout 时间限制之前成功的数据修改。
如果你没有指定 wtimeout 选项,并且安全写级别的等级是不可完成的,那么这个写操作将会永久的阻塞下去。为安全写级别指定一个值为 0 的 wtimeout 就等于没有指定 wtimeout 选项。