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中使用monk访问mongodb
Jul 06 NodeJs
Nodejs实现的一个静态服务器实例
Dec 06 NodeJs
nodejs爬虫抓取数据之编码问题
Jul 03 NodeJs
Nodejs抓取html页面内容(推荐)
Aug 11 NodeJs
Express与NodeJs创建服务器的两种方法
Feb 06 NodeJs
nodejs中全局变量的实例解析
Mar 07 NodeJs
Nodejs搭建wss服务器教程
May 24 NodeJs
webstorm中配置nodejs环境及npm的实例
May 15 NodeJs
nodejs 十六进制字符串型数据与btye型数据相互转换
Jul 30 NodeJs
NodeJS 将文件夹按照存放路径变成一个对应的JSON的方法
Oct 17 NodeJs
nodejs各种姿势断点调试的方法
Jun 18 NodeJs
详解nodejs内置模块
May 06 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
第4章 数据处理-php数组的处理-郑阿奇
2011/07/04 PHP
PHP防CC攻击实现代码
2011/12/29 PHP
PHP判断是否有Get参数的方法
2014/05/05 PHP
PHP中的gzcompress、gzdeflate、gzencode函数详解
2014/07/29 PHP
PHP数据库操作四:mongodb用法分析
2017/08/16 PHP
PHP设计模式之单例模式原理与实现方法分析
2018/04/25 PHP
基于jquery的高性能td和input切换并可修改内容实现代码
2011/01/09 Javascript
JavaScript高级程序设计(第3版)学习笔记5 js语句
2012/10/11 Javascript
html+javascript实现可拖动可提交的弹出层对话框效果
2013/08/05 Javascript
Javascript中innerHTML用法实例分析
2015/01/12 Javascript
JS表的模拟方法
2015/02/05 Javascript
Jquery判断radio、selelct、checkbox是否选中及获取选中值方法总结
2015/04/15 Javascript
JavaScript类型系统之布尔Boolean类型详解
2016/06/26 Javascript
JavaScript判断数组是否存在key的简单实例
2016/08/03 Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
2017/01/11 Javascript
JQuery实现动态操作表格
2017/01/11 Javascript
webpack入门+react环境配置
2017/02/08 Javascript
JS实现复制功能
2017/03/01 Javascript
javascript匿名函数中的'return function()'作用
2018/10/15 Javascript
thinkjs微信中控之微信鉴权登陆的实现代码
2019/08/08 Javascript
WebStorm无法正确识别Vue3组合式API的解决方案
2021/02/18 Vue.js
[02:07]DOTA2超级联赛专访BBC:难忘网吧超神经历
2013/06/09 DOTA
Python中使用PDB库调试程序
2015/04/05 Python
python实时分析日志的一个小脚本分享
2017/05/07 Python
Python使用pymysql小技巧
2017/06/04 Python
Python中函数及默认参数的定义与调用操作实例分析
2017/07/25 Python
python3使用matplotlib绘制散点图
2019/03/19 Python
Python 捕获代码中所有异常的方法
2020/08/03 Python
教你如何用python操作摄像头以及对视频流的处理
2020/10/12 Python
澳大利亚在线家具店:Luxo Living
2019/03/24 全球购物
摄影展策划方案
2014/06/02 职场文书
2015年挂职锻炼工作总结
2014/12/12 职场文书
2014年政工师工作总结
2014/12/18 职场文书
2015年师德师风承诺书
2015/01/22 职场文书
2015年度村委会工作总结
2015/04/29 职场文书
MySQL 重写查询语句的三种策略
2021/05/10 MySQL