Mongo写入安全机制
写入安全(Write Concern) 是一种客户端设置,用于控制写入的安全级别。默认况下,插入、删除和更新都会一直等待数据库响应(写入是否成功),然后才会继续执行。通常,遇到错误时,客户端会抛出一个异常(有些语言中可能不叫“异常”,不过实质上都是类似的东西)。
有一些选项可以用于精确控制需要应用程序等待的内容。两种最基本的写入安全机制是应答式写入(acknowledged wirte)和非应答式写入(unacknowledged write)。应答式写入是默认的方式:数据库会给出响应,告诉你写入操作是否成功执行。非应答式写入不返回任何响应,所以无法知道写入是否成功。
通常来说,应用程序应该使用应答式写入。但是,对于一些不是特别重要的数据 (比如日志或者是批量加载数据),你可能不愿意为了自己不关心的数据而等待数据库响应。在这种情况下,可以使用非应答式写入。
尽管非应答式写入不返回数据库错误,但是这不代表应用程序不需要做错误检查。如果尝试向已经关闭的套接字(socket)执行写入,或者写入套接字时发生了错误,都会引起异常。
使用非应答式写入时,一种经常被忽视的错误是插入无效数据。比如,如果试图插入两个具有相同"_id"字段的文档,shell就会抛出异常:
- > db.foo.insert({"_id" : 1})
- > db.foo.insert({"_id" : 1})
- E11000 duplicate key error index: test.foo.$_id_dup key: { : 1.0 }
如果第二次插入时使用的是非应答式写入,那么第二次插入就不会抛出异常。键重复异常是一种非常常见的错误,还有其他很多类似的错误,比如无效的修改器或者是磁盘空间不足等。
shell与客户端程序对非应答式写入的实际支持并不一样:shell在执行非应答式写入 后,会检查最后一个操作是否成功,然后才会向用户输出提示信息。因此,如果在集合上执行了一系列无效操作,最后又执行了一个有效操作,shell并不会提示有错误发生。
- > db.foo.insert({"_id" : 1}); db.foo.insert({"id" : 1}); db.foo.count()
- 1
可以调用get Last Error手动强制在shell中进行检查,这一操作会检查最后一次 操作中的错误。
- > db.too.insert({"id" : 1}); db.foo.insert({"_id" : 1}); print(
- ... db.getLastError()); db.foo.count()
- E11000 duplicate key error index: test.foo.$_id_ dup key: { : 1.0 }
- 1
编写需要在shell中执行的脚本时,这是非常有用的。
注意:2012年,默认的写入安全机制改变了,所以,遗留代码的行为可能会与预期不一致。在此之前,默认的写入是非应答式的。
幸好,很容易得知当前代码是在默认的写入安全机制发生变化之前写的还是之后写的:默认的写入机制变为安全写入之后,所有驱动程序都开始使用MongoClient这个类。如果程序使用的连接对象是Mongo或者Connection或者其他内容,那么这段程序使用的就是旧的、默认不安全的API。在默认写入安全机制发生变化之前,任何语言都没有使用MongoClient作为类名,所以,如果你的代码使用了这个类名,说明你的代码是写入安全的。
如果使用的连接不是MongoCUent,应在必要时将旧代码中的非应答式写入改成应答式写入。
Mongo写入安全机制的更多相关文章
- Mongo的安全验证
参考如下的文档: https://docs.mongodb.org/manual/tutorial/enable-authentication/ 1.1. 在启用匿名验证的情况下,创 ...
- 关于oracle的缓冲区机制与HDFS中的edit logs的某些关联性的思考
可能大家会问,oracle和HDFS属于不同场景的存储系统,它们之间为什么会有联系呢?确实,从技术本身来看,他们确实无关联,但利用“整体学习”的思想,跳出技术本身,可以发现Oracle的缓冲区和HDF ...
- mongo在centos与windows上部署与配置,及远程连接mongo与数据用户和角色分配
1.下载mongodb社区版: windows 安装包安装: https://www.mongodb.com/download-center#community(mongo下载中心) 配置环境变量 控 ...
- 深入分析Elastic Search的写入过程
摘要 之前写过一篇ElasticSearch初识之吐槽,不知觉竟然过去了两年了.哎,时光催人老啊.最近又用到了ES,想找找过去的总结文档,居然只有一篇,搞了半年的ES,遇到那么多的问题,产出只有这么点 ...
- 微信小程序的网络重试机制
最近在开发微信小程序, 在测试时, 总能碰到一些诸如网络被打断啊之类的问题. 小程序是一款实时互动的小程序, 基于一系列原因, 没有使用Socket, 而是使用的是长链接. 所以对这类问题不能大意啊, ...
- mongo配置
cmd下操作 cd /d E:\MongoDB\bin 创建数据库: mongod --dbpath E:\MongoDB\data\db 验证是否成功,登陆localhost:27017 进入E:\ ...
- Mongo --01 介绍、安装、优化报警
目录 一 . NoSQL 介绍 二.MongoDB简介 三.MongoDB特点 四. mongo应用场景 五. 安装配置mongodb 六.优化报警 一 . NoSQL 介绍 NoSQL,指的是非关系 ...
- mongodb写入安全级别
MongoDB的写安全机制 写入安全(Write Concern)是一种由客户端设置的,用于控制写入安全级别的机制,通过使用写入安全机制可以提高数据的可靠性. MongoDB提供四种写入级别,分别是: ...
- 十个 MongoDB 使用要点
转自: 十个 MongoDB 使用要点 从 mongodb 阶段性技术总结 中抽取并整理了对大家有帮助的十个要点: 1.mongodb 表名和字段名统一用小写字母 mongodb 是默认区分 ...
随机推荐
- xxl-job源码阅读二(服务端)
1.源码入口 xxl-job-admin是一个简单的springboot工程,简单翻看源码,可以很快发现XxlJobAdminConfig入口. @Override public void after ...
- prometheus nginx-module-vts删除内存区数据
项目地址:https://github.com/vozlt/nginx-module-vts 删除所zone内存中的数据 curl localhost/status/control?cmd=delet ...
- javaWeb——Servlet(二)
Servelet登录页面步骤: 浏览器访问http://127.0.0.1/login.html 浏览器通过form把账号和密码提交到/login(通过action),附带method="p ...
- [DB] 大数据集群安装
学习要点 体系架构.原理 多做练习.试验 装虚拟机 网络模式:仅主机模式 software selection:development tools, GUI network & host na ...
- 【转载】Windows 10系统默认将画面显示比例调整至125%或150%,最高分辨率已经达到3840×2160(4K)这一级别。
高分屏打开软件界面模糊?不会设置太浪费 2017-08-31 19:37 抹又重彩 现在有好多朋友都喜欢并买了高分屏笔记本电脑.高分屏笔记本就是配有高分辨率屏幕的笔记本.为了给用户带来更好的视觉体验, ...
- linux使用createrepo制作本地yum源
目录 linux使用createrepo制作本地yum源 安装createrepo软件包 进入本地rpm包目录 执行完后可以看到生成的repodata目录 编辑yum配置文件使用 完成,测试使用 关于 ...
- X Sever —— Xorg
X Sever -- Xorg 发表于 2020-03-20 分类于 系统服务 , Xorg 阅读次数:39 阅读次数:48 本文字数: 7k 阅读时长 ≈ 6 分钟 Xorg:基于X11协议的服务 ...
- OpenStack平台功能性测试工具Tempest安装
社区对OpenStack平台功能性的测试工具采用Tempest,性能测试采用Rally. 1.什么是Tempest tempest├── api # API的测试集├── cli # OpenStac ...
- 基于Centos 7.4 搭建ELK整合SpringBoot日志收集
基于Centos 7.4搭建es7.12.0+logstash-7.12.0+kibana-7.12.0(ELK)整合SpringBoot日志收集 注:Skywalking和logstash可共用一个 ...
- Linux进阶之环境变量文件/etc/profile、/etc/bashrc、/etc/environment
一.Centos 环境变量/etc/profile和/etc/profile.d 1.两个文件都是设置环境变量的文件. 2./etc/profile 是永久性的环境变量,是全局变量,/etc/prof ...