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调用cmd命令实现复制目录
May 04 NodeJs
使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室
Aug 21 NodeJs
Nodejs如何复制文件
Mar 09 NodeJs
详解Nodejs的timers模块
Dec 22 NodeJs
nodejs和php实现图片访问实时处理
Jan 05 NodeJs
nodejs的压缩文件模块archiver用法示例
Jan 18 NodeJs
Nodejs 发送Post请求功能(发短信验证码例子)
Feb 09 NodeJs
nodeJs实现基于连接池连接mysql的方法示例
Feb 10 NodeJs
NodeJS搭建HTTP服务器的实现步骤
Oct 12 NodeJs
详解从NodeJS搭建中间层再谈前后端分离
Nov 13 NodeJs
纯异步nodejs文件夹(目录)复制功能
Sep 03 NodeJs
NodeJS有难度的面试题(能答对几个)
Oct 09 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
什么是短波收听SWL
2021/03/01 无线电
php编写的简单页面跳转功能实现代码
2013/11/27 PHP
php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法
2014/12/15 PHP
php实现猴子选大王问题算法实例
2015/04/20 PHP
php微信公众号开发之音乐信息
2018/10/20 PHP
在 Laravel 项目中使用 webpack-encore的方法
2019/07/21 PHP
js 父窗口控制子窗口的行为-打开,关闭,重定位,回复
2010/04/20 Javascript
js简单工厂模式用法实例
2015/06/30 Javascript
bootstrap table分页模板和获取表中的ID方法
2017/01/10 Javascript
基于nodejs 的多页面爬虫实例代码
2017/05/31 NodeJs
Vue.js递归组件构建树形菜单
2017/12/24 Javascript
js根据需要计算数组中重复出现某个元素的个数
2019/01/18 Javascript
atom-design(Vue.js移动端组件库)手势组件使用教程
2019/05/16 Javascript
JavaScript实现移动端带transition动画的轮播效果
2020/03/24 Javascript
VUE table表格动态添加一列数据,新增的这些数据不可以编辑(v-model绑定的数据不能实时更新)
2020/04/03 Javascript
Ajax获取node服务器数据的完整步骤
2020/09/20 Javascript
vue动态设置路由权限的主要思路
2021/01/13 Vue.js
python批量修改文件名的实现代码
2014/09/01 Python
Python单元测试实例详解
2018/05/25 Python
pygame游戏之旅 如何制作游戏障碍
2018/11/20 Python
利用Python如何实现一个小说网站雏形
2018/11/23 Python
在PyCharm下打包*.py程序成.exe的方法
2018/11/29 Python
Python 多维List创建的问题小结
2019/01/18 Python
Python 切分数组实例解析
2019/11/07 Python
django中间键重定向实例方法
2019/11/10 Python
Python pandas RFM模型应用实例详解
2019/11/20 Python
python 和c++实现旋转矩阵到欧拉角的变换方式
2019/12/04 Python
Python退出时强制运行一段代码的实现方法
2020/04/29 Python
什么是事务?为什么需要事务?
2012/01/09 面试题
接待员岗位责任制
2014/02/10 职场文书
募捐倡议书
2014/04/14 职场文书
上课说话检讨书500字
2014/11/01 职场文书
领导工作表现评语
2015/01/04 职场文书
幼儿园毕业致辞
2015/07/29 职场文书
银行工作心得体会范文
2016/01/23 职场文书
「海贼王」112.9万粉丝纪念图标公布
2022/03/21 日漫