MongoDB——写出错机制

写出错机制

MongoDB的写操作命令默认是没有任何出错返回值的,这减少了写操作的等待时间,也就是说,不管有没有写入到磁盘或者有没有遇到错误,它都不会报错。这在大量插
入类似GPS定位坐标信息时是非常好的,既保证了插入速度,又允许在极端情况下丢失或插入错误数据。但是,在处理电商平台上类似商品订单的高价值数据时,是不允许丢或插入错误数据的。我们希望在出错前给予友好提示。

因此,在数据写操作出错时,我们希望能获得第一手的出错信息。MongoDB的GetLastError就是用来获得写操作是否成功信息的命令。在大多数编程语言驱动包里,这
个命令是被包装成WriteConcern类被客户端应用程序调用的(从MongoDB2.6版开始,程序员无需直接调用GetLastError命令,通过WriteConcern参数选项确定写操作出错捕捉机制)。

1、WriteConcern

在插入、更新、删除命令中,WriteConcern参数格式为:

Writeconcern:{
	w: <value>,
	j: <boolean>,
	wtimeout: <number>
}
参数项参数值参数说明
w0写操作不返回确认错误信息,但是当通信Socket或网络错误时,可能会返回错误信息;w:0,但j:true,则优先返回其他独立Mongod或副本集的主节点写操作错误信息
1写操作返回确认错误信息,w:1是默认写入关注
大于1的参数值仅对副本集有效,以指定确认出错成员的数量
majority写入磁盘日志(Journal),前提要启动磁盘日志。目前MongoDB都默认自动启动磁盘日志当写操作返回结果对象里包含w:"majority"时,客户端可以readConcern读取该写的结果
Jtruej:true时,MongDB返回写磁盘日志的出错信息,包括副本集里任何成员。如果Mongod没有启动日志记录,也进行关注。
wtimeout毫秒数该选项指定写入关注的时间限制,该参数仅适用大于1的W值时的设置当写操作超过该参数指定的时间范围后,返回写出错信息。当返回时,MongoDB不会撤销关注时间范围内己经执行写成功的数据。也就是存在一部分写入成功,一部分写入失败的问题

单机环境下常见的写出错关注参数配置,如下表:

w设置不设置jj:truej:false
w:1数据写入内存数据写入磁盘日志数据写入内存
w:“majority”数据写入磁盘日志,前提要启动磁盘日志数据写入磁盘日志数据写入内存

副本集环境下常见的写出错关注参数配置入下表:

w设置不设置jj:truej: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})

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值