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+express+html5 实现拖拽上传
Aug 08 NodeJs
Nodejs极简入门教程(三):进程
Oct 27 NodeJs
NodeJS中利用Promise来封装异步函数
Feb 25 NodeJs
Nodejs实现批量下载妹纸图
May 28 NodeJs
深入浅析NodeJs并发异步的回调处理
Dec 21 NodeJs
NodeJS使用formidable实现文件上传
Oct 27 NodeJs
NodeJS配置HTTPS服务实例分享
Feb 19 NodeJs
nodejs6下使用koa2框架实例
May 18 NodeJs
对mac下nodejs 更新到最新版本的最新方法(推荐)
May 17 NodeJs
详解nodejs 配置文件处理方案
Jan 02 NodeJs
nodejs 使用http进行post或get请求的实例(携带cookie)
Jan 03 NodeJs
nodejs脚本centos开机启动实操方法
Mar 04 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中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
2010/08/21 PHP
PHP操作MySQL事务实例
2014/11/05 PHP
ThinkPHP中公共函数路径和配置项路径的映射分析
2014/11/22 PHP
PHP SPL标准库之接口(Interface)详解
2015/05/11 PHP
深入浅析yii2-gii自定义模板的方法
2016/04/26 PHP
ThinkPHP框架实现的微信支付接口开发完整示例
2019/04/10 PHP
JSON 学习之完全手册 图文
2007/05/29 Javascript
javaScript 简单验证代码(用户名,密码,邮箱)
2009/09/28 Javascript
更换select下拉菜单背景样式的实现代码
2011/12/20 Javascript
Three.js源码阅读笔记(基础的核心Core对象)
2012/12/27 Javascript
javascript检测页面是否缩放的小例子
2013/05/16 Javascript
引入JS文件IE6报语法错误或缺少对象问题的解决方法
2014/01/09 Javascript
我的Node.js学习之路(四)--单元测试
2014/07/06 Javascript
JavaScript中的无阻塞加载性能优化方案
2014/10/10 Javascript
jquery.uploadify插件在chrome浏览器频繁崩溃解决方法
2015/03/01 Javascript
最简单的JavaScript验证整数、小数、实数、有效位小数正则表达式
2015/04/17 Javascript
针对初学者的jQuery入门指南
2015/08/15 Javascript
javascript 判断是否是微信浏览器的方法
2016/10/09 Javascript
vue 和vue-touch 实现移动端左右导航效果(仿京东移动站导航)
2017/04/22 Javascript
微信小程序tabbar不显示解决办法
2017/06/08 Javascript
详解HTTPS 的原理和 NodeJS 的实现
2017/07/04 NodeJs
js数组实现权重概率分配
2017/09/12 Javascript
vue-cli和v-charts实现可视化图表过程解析
2019/10/08 Javascript
微信小程序可滑动月日历组件使用详解
2019/10/21 Javascript
python中 logging的使用详解
2017/10/25 Python
python的变量与赋值详细分析
2017/11/08 Python
python 实现保存最新的三份文件,其余的都删掉
2019/12/22 Python
YSL圣罗兰美妆美国官网:Yves Saint Lauret US
2016/11/21 全球购物
文科教师毕业的自我评价
2014/01/16 职场文书
外贸业务员求职信
2014/06/16 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
小学2016年第十八届推普周活动总结
2016/04/05 职场文书
导游词之宿迁乾隆行宫
2019/10/15 职场文书
基于Redis6.2.6版本部署Redis Cluster集群的问题
2022/04/01 Redis
人工智能深度学习OpenAI baselines的使用方法
2022/05/20 Python
vue3 自定义图片放大器效果的示例代码
2022/07/23 Vue.js