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 相关文章推荐
windows系统下简单nodejs安装及环境配置
Jan 08 NodeJs
用nodejs实现PHP的print_r函数代码
Mar 14 NodeJs
nodejs中简单实现Javascript Promise机制的实例
Dec 06 NodeJs
nodejs批量修改文件编码格式
Jan 22 NodeJs
Nodejs关于gzip/deflate压缩详解
Mar 04 NodeJs
NodeJS远程代码执行
Aug 28 NodeJs
使用nodejs下载风景壁纸
Feb 05 NodeJs
Nodejs 获取时间加手机标识的32位标识实现代码
Mar 07 NodeJs
nodejs多版本管理总结
Apr 03 NodeJs
Nodejs Express 通过log4js写日志到Logstash(ELK)
Aug 30 NodeJs
nodejs中用npm初始化来创建package.json的实例讲解
Oct 10 NodeJs
Nodejs让异步变成同步的方法
Mar 02 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 网页游戏开发入门教程一(webgame+design)
2009/10/26 PHP
CodeIgniter上传图片成功的全部过程分享
2013/08/12 PHP
php取得字符串首字母的方法
2015/03/25 PHP
php动态读取数据清除最右边距的方法
2017/04/12 PHP
JavaScript 保存数组到Cookie的代码
2010/04/14 Javascript
jQuery ajax在GBK编码下表单提交终极解决方案(非二次编码方法)
2010/10/20 Javascript
jQuery编程中的一些核心方法简介
2015/08/14 Javascript
jQuery实现简单的图片查看器
2020/09/11 Javascript
JavaScript实现垂直滚动条效果
2017/01/18 Javascript
bootstrap3-dialog-master模态框使用详解
2017/08/22 Javascript
通过 JS 判断页面是否有滚动条的实现方法
2018/04/05 Javascript
js实现各浏览器全屏代码实例
2018/07/03 Javascript
vue axios 简单封装以及思考
2018/10/09 Javascript
Vue实现类似Spring官网图片滑动效果方法
2019/03/01 Javascript
基于Vue实现平滑过渡的拖拽排序功能
2019/06/12 Javascript
[02:40]DOTA2殁境神蚀者 英雄基础教程
2013/11/26 DOTA
[02:39]我与DAC之Newbee.Moogy:从论坛到TI
2018/03/26 DOTA
Python pass 语句使用示例
2014/03/11 Python
如何解决django配置settings时遇到Could not import settings 'conf.local'
2014/11/18 Python
Python实现SSH远程登陆,并执行命令的方法(分享)
2017/05/08 Python
Python数据可视化正态分布简单分析及实现代码
2017/12/04 Python
python读文件保存到字典,修改字典并写入新文件的实例
2018/04/23 Python
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
2019/01/29 Python
Python同步遍历多个列表的示例
2019/02/19 Python
在django admin中添加自定义视图的例子
2019/07/26 Python
Matplotlib绘制雷达图和三维图的示例代码
2020/01/07 Python
Python中qutip用法示例详解
2020/10/02 Python
一款纯css3实现的鼠标悬停动画按钮
2014/12/29 HTML / CSS
使用HTML5 Canvas API中的clip()方法裁剪区域图像
2016/03/25 HTML / CSS
const和static readonly区别
2013/05/20 面试题
信息管理专业学生自荐信格式
2013/09/22 职场文书
三年级班级文化建设方案
2014/05/04 职场文书
捐款活动总结
2014/08/27 职场文书
上级领导检查欢迎词
2015/09/30 职场文书
如何书写先进事迹材料?
2019/07/02 职场文书
python 如何做一个识别率百分百的OCR
2021/05/29 Python