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实用示例 缩址还原
Dec 28 NodeJs
Nodejs实现的一个静态服务器实例
Dec 06 NodeJs
nodejs事件的监听与触发的理解分析
Feb 12 NodeJs
nodejs实现遍历文件夹并统计文件大小
May 28 NodeJs
NodeJS遍历文件生产文件列表功能示例
Jan 22 NodeJs
nodejs入门教程二:创建一个简单应用示例
Apr 24 NodeJs
nodejs 子进程正确的打开方式
Jul 03 NodeJs
Nodejs实现文件上传的示例代码
Sep 26 NodeJs
Nodejs下使用gm圆形裁剪并合成图片的示例
Feb 22 NodeJs
nodejs acl的用户权限管理详解
Mar 14 NodeJs
nodejs实现一个word文档解析器思路详解
Aug 14 NodeJs
nodejs利用readline提示输入内容实例代码
Jul 15 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 递归效率分析
2009/11/24 PHP
使用PHP实现密保卡功能实现代码<打包下载直接运行>
2011/10/09 PHP
php读取EXCEL文件 php excelreader读取excel文件
2012/12/06 PHP
PHP实现文件上传与下载实例与总结
2016/03/13 PHP
ThinkPHP实现简单登陆功能
2017/04/28 PHP
php实现评论回复删除功能
2017/05/23 PHP
php5.6.x到php7.0.x特性小结
2019/08/17 PHP
ExtJS Store的数据访问与更新问题
2010/04/28 Javascript
jQuery中bind()方法用法实例
2015/01/19 Javascript
微信小程序 页面跳转如何实现传值
2017/04/05 Javascript
JavaScript 数组的进化与性能分析
2017/09/18 Javascript
Vue+Flask实现简单的登录验证跳转的示例代码
2018/01/13 Javascript
Vue+Koa2 打包后进行线上部署的教程详解
2019/07/31 Javascript
微信小程序里引入SVG矢量图标的方法
2019/09/20 Javascript
在vue中实现给每个页面顶部设置title
2020/07/29 Javascript
Python脚本暴力破解栅栏密码
2015/10/19 Python
tensorflow获取变量维度信息
2018/03/10 Python
Flask框架URL管理操作示例【基于@app.route】
2018/07/23 Python
Django基础知识 URL路由系统详解
2019/07/18 Python
python使用socket 先读取长度,在读取报文内容示例
2019/09/26 Python
Python字符串三种格式化输出
2020/09/17 Python
世界上最大的艺术和工艺用品商店:MisterArt.com
2018/07/13 全球购物
美国手机支架公司:PopSockets
2019/11/27 全球购物
正隆泰信息技术有限公司上机题
2012/06/14 面试题
采购员岗位职责
2013/11/15 职场文书
物流管理专业职业生涯规划书
2014/01/06 职场文书
社区党总支书记先进事迹材料
2014/01/24 职场文书
函授生自我鉴定
2014/03/25 职场文书
《登鹳雀楼》教学反思
2014/04/09 职场文书
精彩的演讲稿开头
2014/05/08 职场文书
2014公司党员自我评价范文
2014/09/11 职场文书
党的群众路线教育实践活动个人整改方案
2014/10/25 职场文书
Python还能这么玩之只用30行代码从excel提取个人值班表
2021/06/05 Python
详解Java实践之适配器模式
2021/06/18 Java/Android
Mysql数据库值的添加、修改、删除及清空操作实例
2021/06/20 MySQL
利用Python多线程实现图片下载器
2022/03/25 Python