NodeJs使用Mysql模块实现事务处理实例


Posted in NodeJs onMay 31, 2017

依赖模块:

1. mysql:https://github.com/felixge/node-mysql

npm install mysql --save

2. async:https://github.com/caolan/async

npm install async --save

(ps: async模块可换成其它Promise模块如bluebird、q等) 

因为Node.js的mysql模块本身对于事务的封装过于简单,而且直接使用会有很严重callback hell,故我们封装了两个方法,一个用来初始化sql & params,一个用来执行事务。

初始化sql & params:

function _getNewSqlParamEntity(sql, params, callback) {
  if (callback) {
    return callback(null, {
      sql: sql,
      params: params
    });
  }
  return {
    sql: sql,
    params: params
  };
}

如果你要执行多条sql语句,则需要:

var sqlParamsEntity = [];
var sql1 = "insert table set a=?, b=? where 1=1";
var param1 = {a:1, b:2};
sqlParamsEntity.push(_getNewSqlParamEntity(sql1, param1));

var sql2 = "update ...";
sqlParamsEntity.push(_getNewSqlParamEntity(sql1, []));

//...更多要事务执行的sql

然后我在我自己的dbHelper.js里封装了execTrans的函数,用来执行事务

var mysql = require('mysql');
var async = require("async");

module.exports = {
  execTrans: execTrans,
}

var pool = mysql.createPool({
  host: "mysql host",
  user: "mysql login user",
  password: "mysql login pwd",
  database: "target db name",
  connectionLimit: 10,
  port: "mysql db port",
  waitForConnections: false
});

function execTrans(sqlparamsEntities, callback) {
  pool.getConnection(function (err, connection) {
    if (err) {
      return callback(err, null);
    }
    connection.beginTransaction(function (err) {
      if (err) {
        return callback(err, null);
      }
      console.log("开始执行transaction,共执行" + sqlparamsEntities.length + "条数据");
      var funcAry = [];
      sqlparamsEntities.forEach(function (sql_param) {
        var temp = function (cb) {
          var sql = sql_param.sql;
          var param = sql_param.params;
          connection.query(sql, param, function (tErr, rows, fields) {
            if (tErr) {
              connection.rollback(function () {
                console.log("事务失败," + sql_param + ",ERROR:" + tErr);
                throw tErr;
              });
            } else {
              return cb(null, 'ok');
            }
          })
        };
        funcAry.push(temp);
      });

      async.series(funcAry, function (err, result) {
        console.log("transaction error: " + err);
        if (err) {
          connection.rollback(function (err) {
            console.log("transaction error: " + err);
            connection.release();
            return callback(err, null);
          });
        } else {
          connection.commit(function (err, info) {
            console.log("transaction info: " + JSON.stringify(info));
            if (err) {
              console.log("执行事务失败," + err);
              connection.rollback(function (err) {
                console.log("transaction error: " + err);
                connection.release();
                return callback(err, null);
              });
            } else {
              connection.release();
              return callback(null, info);
            }
          })
        }
      })
    });
  });
}

这样就可以执行事务了:

execTrans(sqlParamsEntity, function(err, info){
if(err){
  console.error("事务执行失败");
}else{
  console.log("done.");
}
})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
nodejs npm package.json中文文档
Sep 04 NodeJs
轻松创建nodejs服务器(6):作出响应
Dec 18 NodeJs
nodejs 整合kindEditor实现图片上传
Feb 03 NodeJs
基于html5和nodejs相结合实现websocket即使通讯
Nov 19 NodeJs
NodeJS中的MongoDB快速入门详细教程
Nov 11 NodeJs
Nodejs高扩展性的模板引擎 functmpl简介
Feb 13 NodeJs
解决nodejs中使用http请求返回值为html时乱码的问题
Feb 18 NodeJs
深入nodejs中流(stream)的理解
Mar 27 NodeJs
详解nodejs微信jssdk后端接口
May 25 NodeJs
nodejs集成sqlite使用示例
Jun 05 NodeJs
NodeJS实现图片上传代码(Express)
Jun 30 NodeJs
详解使用vscode+es6写nodejs服务端调试配置
Sep 21 NodeJs
基于nodejs 的多页面爬虫实例代码
May 31 #NodeJs
详解nodeJS之路径PATH模块
May 31 #NodeJs
NodeJS实现微信公众号关注后自动回复功能
May 31 #NodeJs
nodejs操作mysql实现增删改查的实例
May 28 #NodeJs
详解nodejs微信jssdk后端接口
May 25 #NodeJs
mac下的nodejs环境安装的步骤
May 24 #NodeJs
Nodejs搭建wss服务器教程
May 24 #NodeJs
You might like
PHP中的正规表达式(一)
2006/10/09 PHP
关于Appserv无法打开localhost问题的解决方法
2009/10/16 PHP
php 上传文件类型判断函数(避免上传漏洞 )
2010/06/08 PHP
两千行代码的PHP学习笔记汇总
2014/10/05 PHP
php中smarty模板条件判断用法实例
2015/06/11 PHP
Laravel搭建后台登录系统步骤详解
2016/07/26 PHP
用js小类库获取浏览器的高度和宽度信息
2012/01/15 Javascript
jQuery判断浏览器并动态调整select宽度的方法
2016/03/02 Javascript
ashx文件获取$.ajax()方法发送的数据
2016/05/26 Javascript
Jquery实现上下移动和排序代码
2016/10/17 Javascript
BootStrap表单验证 FormValidation 调整反馈图标位置的实例代码
2017/05/17 Javascript
微信小程序Flex布局用法深入浅出分析
2019/04/25 Javascript
layer弹出层取消遮罩的方法
2019/09/25 Javascript
js实现多个标题吸顶效果
2020/01/08 Javascript
vue-cli点击实现全屏功能
2020/03/07 Javascript
基于leaflet.js实现修改地图主题样式的流程分析
2020/05/15 Javascript
[03:14]DOTA2斧王 英雄基础教程
2013/11/26 DOTA
收藏整理的一些Python常用方法和技巧
2015/05/18 Python
解决Python一行输出不显示的问题
2018/12/03 Python
Python求均值,方差,标准差的实例
2019/06/29 Python
Django ORM 聚合查询和分组查询实现详解
2019/08/09 Python
如何理解Python中的变量
2020/06/01 Python
Python代码需要缩进吗
2020/07/01 Python
Python3获取cookie常用三种方案
2020/10/05 Python
HTML5实现简单图片上传所遇到的问题及解决办法
2016/01/20 HTML / CSS
洛杉矶生活休闲而精致的基础品牌:Mika Jaymes
2018/01/07 全球购物
希腊香水和化妆品购物网站:Parfimo.gr
2019/10/03 全球购物
俄罗斯电子产品、计算机和家用电器购物网站:OLDI
2019/10/27 全球购物
共产党员公开承诺书范文
2014/03/28 职场文书
安全保证书范文
2014/04/29 职场文书
毕业生求职信范文
2014/06/29 职场文书
机关党员三严三实心得体会
2014/10/13 职场文书
县级领导干部开展党的群众路线教育实践活动工作汇报
2014/10/25 职场文书
庆祝教师节活动总结
2015/03/23 职场文书
幼儿园开学温馨提示
2015/07/15 职场文书
详解CSS中的特指度和层叠问题
2021/07/15 HTML / CSS