Node.js原子性操作MongoDB实例教程

假设基础数据为:

{ "name" : "cb", "data" : 0,}

有时候为了充分利用多核,会同时开启多个node进程,但是若部分代码若涉及到操作mongodb就会有下面现象.

“理想情况下”,多个进程执行完后得数据为:

{ "name" : "cb", "data" : 6000,}

其实不然 !

我们看看获得结果是怎么样的.

co(function * () {
 for (var i = 0; i < 3000; i++) {
  var getTest = yield mongoCtest.findOne({
   "name": "cb"
  },
  {
   "fields": {
    "_id": 0
   }
  });
  getTest.data = getTest.data + 1;
  console.log(getTest);
  yield mongoCtest.update({
   "name": "good"
  },
  {
   "$set": getTest
  });
 }
})();

上面的程序同时开两个,多个进程同时操作一个数据.

可能结果会是:

 

多进程操作Mongo

我们知道Mongo是不支持事务的,如果你能容忍上面的弱一致性,那么没问题.但是如果你不能容忍,要么考虑MySql关系型数据库,要么自己解决事务问题.

下面我来说下基于Mongo怎么解决事务问题.

我们需要对每个数据加一个version来控制.直接上代码:

co(function * () {
 for (var i = 0; i < 3000; i++) {
  while (1) {
   var getTest = yield mongoCtest.findOne({
    "name": "cb"
   },
   {
    "fields": {
     "_id": 0
    }
   });
   getTest.data = getTest.data + 1;
   var originalVer = getTest.ver;
   getTest.ver = getTest.ver + 1;
   console.log(getTest);
   var ret = yield mongoCtest.update({
    "name": "cb",
    "ver": originalVer
   },
   {
    "$set": getTest
   });
   if (ret) break;
  }
 }
})();

下面就是我们想要的结果:)

 

时间: 2024-08-02 04:48:56

Node.js原子性操作MongoDB实例教程的相关文章

使用Python脚本操作MongoDB的教程_python

连接数据库 MongoClient VS Connection class MongoClient(pymongo.common.BaseObject) | Connection to MongoDB. | | Method resolution order: | MongoClient | pymongo.common.BaseObject | __builtin__.object | class Connection(pymongo.mongo_client.MongoClient) | C

Vue.js组件使用开发实例教程_javascript技巧

组件 组件可以扩展HTML元素,封装可重用的代码,在较高的层面上,组件是自定义元素,vue.js的编译器为它添加特殊功能,在有些情况下,组件也可以是原生HTML元素的形式,以is特性扩展. Vue.js的组件可以理解为预先定义好了行为的ViewModel类.一个组件可以预定义很多选项,但最核心的是以下几个: 模板(template):模板声明了数据和最终展现给用户的DOM之间的映射关系. 初始数据(data):一个组件的初始数据状态.对于可复用的组件来说,这通常是私有的状态. 接受的外部参数(p

php操作MongoDB基础教程

 这篇文章主要介绍了php操作MongoDB简明教程,包括连接.新增.修改.删除.查询等,需要的朋友可以参考下  代码如下: //连接localhost:27017 $conn = new Mongo();   //连接远程主机默认端口 $conn = new Mongo('test.com');   //连接远程主机22011端口 $conn = new Mongo('test.com:22011');   //MongoDB有用户名密码 $conn = new Mongo("mongodb:

windows系统下node.js环境配置与安装教程图文详解(详细版)_win服务器

国内目前关注最高,维护最好的一个关于nodejs的网站应该是http://www.cnodejs.org/ windows系统下简单nodejs环境配置. 第一步:下载安装文件 下载地址:官网https://nodejs.org/en/download/ 这里用的是 第二步:安装nodejs 下载完成之后,双击 node-v6.9.1-x64.msi,开始安装nodejs,默认是安装在C:\Program Files\nodejs下面 第三步:安装相关环境 打开C:\Program Files\

Node.js文件操作二

前面的博客 Node.js文件操作一中主要是对文件的读写操作,其实还有文件这块还有一些其他操作. 一.验证文件path是否正确(系统是如下定义的) fs.exists = function(path, callback) { if (!nullCheck(path, cb)) return; var req = new FSReqWrap(); req.oncomplete = cb; binding.stat(pathModule._makeLong(path), req); function

js setFullYear() toUTCString() getDay()实例教程

js setFullYear() toUTCString() getDay()实例教程 先看setFullYear() 实例: <html> <body> <script type="text/javascript"> var d = new Date(); d.setFullYear(1992,10,3); document.write(d); </script> </body> </html> 结果. Thu,

xtemplate node.js 的使用方法实例解析_node.js

工程下安装XTemplate并使用它的方法实例说明: 1.安装xtpl 复制代码 代码如下: npm install xtpl xtemplate --save 2.在views目录添加test.xtpl文件,其内容为 this is {{title}}! 4.集成到Express中,只需要在app.js中,设置模板引擎即可 var print = require('./routes/print'); //此行代码放入app.js的require 声明代码段下边 app.set('view en

Node.js中使用mongoskin操作mongoDB实例_node.js

一.废话 从13年1月份接触mongodb进行开发,开发了旅游标签服务.微博标签检索系统.地图服务.web APP服务...使用MongoDB的场景从.NET.JAVA环境转到了node.js平台.越发觉Node.js和mongodb结合感觉的很好.感觉mongodb和node.js是天生的一对.的确,mongodb的客户端是JS的解析引擎.因此,选择mongodb和node.js做产品原型也是很nice的选择.网上,遇到网友询问mongodb的开发,选择哪个driver最好,以前一直是使用原生

从零开始搭建Node.js, Express, Ejs, Mongodb服务器

第1部分 – 15分钟安装 如果你真的是从零开始学,那就花点时间先把环境搭建起来吧.这不难,我用的是Win8,所以这看上去跟那些用Mac和Ubuntu或者其它*nix系统的教程有点区别,不过大致是一样的. 第1步 – 安装Node.JS 这很容易,进入Node.js官方网站,点击绿色的大Install按钮,它会自动检测你的系统并给你一个正确的安装文件的下载.(如果没有,点击Download按钮选择你需要的下载).运行安装程序,这样就好了.你已经装上了Node.js,和NPM(Node包管理器)可