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 06 NodeJs
详解nodejs中的process进程
Mar 19 NodeJs
详解nodejs微信公众号开发——2.自动回复
Apr 10 NodeJs
深入理解Nodejs Global 模块
Jun 03 NodeJs
理解nodejs的stream和pipe机制的原理和实现
Aug 12 NodeJs
Nodejs进阶之服务端字符编解码和乱码处理
Sep 04 NodeJs
Linux Centos7.2下安装nodejs&npm配置全局路径的教程
May 15 NodeJs
nodejs 使用 js 模块的方法实例详解
Dec 04 NodeJs
nodejs基础之buffer缓冲区用法分析
Dec 26 NodeJs
nodeJs的安装与npm全局环境变量的配置详解
Jan 06 NodeJs
NodeJS多种创建WebSocket监听的方式(三种)
Jun 04 NodeJs
NodeJS和浏览器中this关键字的不同之处
Mar 03 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 编程请选择正确的文本编辑软件
2006/12/21 PHP
PHP 处理图片的类实现代码
2009/10/23 PHP
php对接java现实加签验签的实例
2016/11/25 PHP
Discuz不使用插件实现简单的打赏功能
2019/03/21 PHP
php引用和拷贝的区别知识点总结
2019/09/23 PHP
JavaScript 继承详解 第一篇
2009/08/30 Javascript
javascript 面向对象的JavaScript类
2010/05/04 Javascript
jquery和javascript的区别(常用方法比较)
2013/07/04 Javascript
得到form下的所有的input的js代码
2013/11/07 Javascript
javascript获取和判断浏览器窗口、屏幕、网页的高度、宽度等
2014/05/08 Javascript
高性能JavaScript模板引擎实现原理详解
2015/02/05 Javascript
jQuery实现获取绑定自定义事件元素的方法
2015/12/02 Javascript
莱鸟介绍javascript onclick事件
2016/01/06 Javascript
AngularJS实现给动态生成的元素绑定事件的方法
2016/12/14 Javascript
jQuery结合jQuery.cookie.js插件实现换肤功能示例
2017/10/14 jQuery
jQuery实现的滑块滑动导航效果示例
2018/06/04 jQuery
写了个监控nginx进程的Python脚本
2012/05/10 Python
Python之父谈Python的未来形式
2016/07/01 Python
python爬取微信公众号文章
2018/08/31 Python
Python中pymysql 模块的使用详解
2019/08/12 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
2019/08/12 Python
python datetime中strptime用法详解
2019/08/29 Python
Python多继承以及MRO顺序的使用
2019/11/11 Python
使用Python内置模块与函数进行不同进制的数的转换
2020/04/26 Python
CSS3之transition实现下划线的示例代码
2018/05/30 HTML / CSS
HTML5 Canvas入门学习教程
2016/03/17 HTML / CSS
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
2017/08/18 HTML / CSS
中国领先的汽车保养服务平台:途虎养车
2019/10/18 全球购物
食品营养与检测应届生求职信
2013/11/08 职场文书
社会学专业求职信
2014/02/24 职场文书
家长对老师的感言
2014/03/11 职场文书
《翻越远方的大山》教学反思
2014/04/13 职场文书
教师群众路线教育实践活动学习笔记
2014/11/05 职场文书
世界环境日活动总结
2015/02/11 职场文书
前端监听websocket消息并实时弹出(实例代码)
2021/11/27 Javascript
Win11软件图标固定到任务栏
2022/04/19 数码科技