写出错机制
MongoDB的写操作命令默认是没有任何出错返回值的,这减少了写操作的等待时间,也就是说,不管有没有写入到磁盘或者有没有遇到错误,它都不会报错。这在大量插
入类似GPS定位坐标信息时是非常好的,既保证了插入速度,又允许在极端情况下丢失或插入错误数据。但是,在处理电商平台上类似商品订单的高价值数据时,是不允许丢或插入错误数据的。我们希望在出错前给予友好提示。
因此,在数据写操作出错时,我们希望能获得第一手的出错信息。MongoDB的GetLastError就是用来获得写操作是否成功信息的命令。在大多数编程语言驱动包里,这
个命令是被包装成WriteConcern类被客户端应用程序调用的(从MongoDB2.6版开始,程序员无需直接调用GetLastError命令,通过WriteConcern参数选项确定写操作出错捕捉机制)。
1、WriteConcern
在插入、更新、删除命令中,WriteConcern参数格式为:
Writeconcern:{
w: <value>,
j: <boolean>,
wtimeout: <number>
}
参数项 | 参数值 | 参数说明 |
---|---|---|
w | 0 | 写操作不返回确认错误信息,但是当通信Socket或网络错误时,可能会返回错误信息;w:0,但j:true,则优先返回其他独立Mongod或副本集的主节点写操作错误信息 |
1 | 写操作返回确认错误信息,w:1是默认写入关注 | |
大于1的参数值仅对副本集有效,以指定确认出错成员的数量 | ||
majority | 写入磁盘日志(Journal),前提要启动磁盘日志。目前MongoDB都默认自动启动磁盘日志当写操作返回结果对象里包含w:"majority"时,客户端可以readConcern读取该写的结果 | |
J | true | j:true时,MongDB返回写磁盘日志的出错信息,包括副本集里任何成员。如果Mongod没有启动日志记录,也进行关注。 |
wtimeout | 毫秒数 | 该选项指定写入关注的时间限制,该参数仅适用大于1的W值时的设置当写操作超过该参数指定的时间范围后,返回写出错信息。当返回时,MongoDB不会撤销关注时间范围内己经执行写成功的数据。也就是存在一部分写入成功,一部分写入失败的问题 |
单机环境下常见的写出错关注参数配置,如下表:
w设置 | 不设置j | j:true | j:false |
---|---|---|---|
w:1 | 数据写入内存 | 数据写入磁盘日志 | 数据写入内存 |
w:“majority” | 数据写入磁盘日志,前提要启动磁盘日志 | 数据写入磁盘日志 | 数据写入内存 |
副本集环境下常见的写出错关注参数配置入下表:
w设置 | 不设置j | j:true | j:false |
---|---|---|---|
w:为数值 | 数据写入内存 | 数据写入磁盘日志 | 数据写入内存 |
w:“majority” | 取决于writeConcernMajorityJournalDefault()的值,如果为true,则写入磁盘日志;如果为false,写入内存 | 数据写入磁盘日志 | 数据写入内存 |
2、写出错示例
- insert出错实例
假设已经插入一条下面的文档,再次插入该文档时将报出错。
db.goodsbaseinf.insert(
{_id:1, item: "大学生教材", name: "《大学一年级语文(上册)》", price:50},
{writeConcern: {w: "majority", wtimeout: 2000}}
)
- update出错实例
db.goodsbaseinf.update(
{_id: 1},
{$set{item:"大学}$生教材}},
{writeConcern: {w: 1,}}
)
- remove出错实例
db.goodsbaseinf.remove({_id / 2s})