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学习笔记之Stream模块
Jan 13 NodeJs
NodeJS使用jQuery选择器操作DOM
Feb 13 NodeJs
在windows上用nodejs搭建静态文件服务器的简单方法
Aug 11 NodeJs
nodejs连接mongodb数据库实现增删改查
Dec 01 NodeJs
nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例
Jan 05 NodeJs
nodejs简单访问及操作mysql数据库的方法示例
Mar 15 NodeJs
nodejs简单读写excel内容的方法示例
Mar 16 NodeJs
NodeJS安装图文教程
Apr 19 NodeJs
nodejs中用npm初始化来创建package.json的实例讲解
Oct 10 NodeJs
nodejs实现的http、https 请求封装操作示例
Feb 06 NodeJs
nodejs实现百度舆情接口应用示例
Feb 07 NodeJs
Nodejs 微信小程序消息推送的实现
Jan 20 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下通过POST还是GET来传值
2008/06/05 PHP
PHP通过引用传递参数用法分析
2016/12/01 PHP
PHP单元测试框架PHPUnit用法详解
2019/01/23 PHP
javascript游戏开发之《三国志曹操传》零部件开发(五)可移动地图的实现
2013/01/23 Javascript
不同Jquery版本引发的问题解决
2013/10/14 Javascript
javascript删除一个html元素节点的方法
2014/12/20 Javascript
js实现鼠标触发图片抖动效果的方法
2015/02/27 Javascript
jquery 插件实现多行文本框[textarea]自动高度
2015/03/04 Javascript
浅谈Javascript数组索引
2015/07/29 Javascript
三个js循环的关键字示例(for与while)
2016/02/16 Javascript
深入探究JavaScript中for循环的效率问题及相关优化
2016/03/13 Javascript
关于JavaScript和jQuery的类型判断详解
2016/10/08 Javascript
JS中通过url动态获取图片大小的方法小结(两种方法)
2018/10/31 Javascript
vue19 组建 Vue.extend component、组件模版、动态组件 的实例代码
2019/04/04 Javascript
Python中用Descriptor实现类级属性(Property)详解
2014/09/18 Python
python自动zip压缩目录的方法
2015/06/28 Python
使用python将时间转换为指定的格式方法
2018/11/12 Python
python根据url地址下载小文件的实例
2018/12/18 Python
在Python函数中输入任意数量参数的实例
2019/07/16 Python
Windows10下 python3.7 安装 facenet的教程
2019/09/10 Python
python安装本地whl的实例步骤
2019/10/12 Python
python装饰器使用实例详解
2019/12/14 Python
520使用Python实现“我爱你”表白
2020/05/20 Python
Roxy美国官网:澳大利亚冲浪、滑雪健身品牌
2016/07/30 全球购物
北承题目(C++)
2012/05/16 面试题
给排水工程师岗位职责
2013/11/21 职场文书
《小松树和大松树》教学反思
2014/02/20 职场文书
不拖欠农民工工资承诺书
2014/03/31 职场文书
我爱我校演讲稿
2014/05/21 职场文书
班主任寄语2015
2015/02/26 职场文书
借条如何写
2015/05/26 职场文书
2015年幼儿园师德师风建设工作总结
2015/10/23 职场文书
高效笔记技巧分享:学会这些让你不再困扰
2019/09/04 职场文书
竞聘演讲报告:基本写作有哪些?附开头范文
2019/10/16 职场文书
关于CSS浮动与取消浮动的问题
2021/06/28 HTML / CSS
Golang map映射的用法
2022/04/22 Golang