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中自定义事件实例
Jun 20 NodeJs
Nodejs全栈框架StrongLoop推荐
Nov 09 NodeJs
nodejs下打包模块archiver详解
Dec 03 NodeJs
nodejs实现获取当前url地址及url各种参数值
Jun 25 NodeJs
nodejs实现bigpipe异步加载页面方案
Jan 26 NodeJs
nodejs个人博客开发第七步 后台登陆
Apr 12 NodeJs
nodejs异步编程基础之回调函数用法分析
Dec 26 NodeJs
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
Apr 29 NodeJs
nodejs语言实现验证码生成功能的示例代码
Oct 13 NodeJs
基于NodeJS开发钉钉回调接口实现AES-CBC加解密
Aug 20 NodeJs
用Nodejs实现在终端中炒股的实现
Oct 18 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中的integer类型使用分析
2010/07/27 PHP
学习使用curl采集curl使用方法
2012/01/11 PHP
php抽奖概率算法(刮刮卡,大转盘)
2020/04/17 PHP
php array 转json及java 转换 json数据格式操作示例
2019/11/13 PHP
extjs form textfield的隐藏方法
2008/12/29 Javascript
lyhucSelect基于Jquery的Select数据联动插件
2011/03/29 Javascript
jquery聚焦文本框与扩展文本框聚焦方法
2012/10/12 Javascript
jquery插件jquery倒计时插件分享
2013/12/27 Javascript
jquery分析文本里url或邮件地址为真实链接的方法
2015/06/20 Javascript
jQuery拖动布局其结果保存到数据库
2015/10/09 Javascript
jQuery+json实现的简易Ajax调用实例
2015/12/14 Javascript
基于jQuery日历插件制作日历
2016/03/11 Javascript
js小数计算小数点后显示多位小数的实现方法
2016/05/30 Javascript
详解AngularJS如何实现跨域请求
2016/08/22 Javascript
jQuery实现移动端Tab选项卡效果
2017/03/15 Javascript
Three.js利用dat.GUI如何简化试验流程详解
2017/09/26 Javascript
Angular5升级RxJS到5.5.3报错:EmptyError: no elements in sequence的解决方法
2018/04/09 Javascript
JS返回页面时自动回滚到历史浏览位置
2018/09/26 Javascript
vue将单页面改造成多页面应用的方法
2018/11/25 Javascript
基于vue-cli 路由 实现类似tab切换效果(vue 2.0)
2019/05/08 Javascript
python装饰器与递归算法详解
2016/02/18 Python
Django使用详解:ORM 的反向查找(related_name)
2018/05/30 Python
python编程进阶之异常处理用法实例分析
2020/02/21 Python
python数据分析工具之 matplotlib详解
2020/04/09 Python
基于python实现数组格式参数加密计算
2020/04/21 Python
SpringBoot首页设置解析(推荐)
2021/02/11 Python
北美最大的手工艺品零售商之一:Michaels Stores
2019/02/27 全球购物
个人简历自我评价
2014/01/06 职场文书
《玩具柜台前的孩子》教学反思
2014/02/13 职场文书
员工工作自我评价
2014/09/26 职场文书
正风肃纪剖析材料范文
2014/10/10 职场文书
个人对照检查剖析材料
2014/10/13 职场文书
放射科岗位职责
2015/02/14 职场文书
大学生青年志愿者活动总结
2015/05/06 职场文书
学术研讨会主持词
2015/07/04 职场文书
文案策划岗位个人自我评价(范文)
2019/08/08 职场文书