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中自定义事件实例
Jun 20 NodeJs
Google官方支持的NodeJS访问API,提供后台登录授权
Jul 29 NodeJs
nodejs中简单实现Javascript Promise机制的实例
Dec 06 NodeJs
详解NodeJS框架express的路径映射(路由)功能及控制
Mar 24 NodeJs
详解Nodejs之npm&package.json
Jun 15 NodeJs
浅谈nodejs中的类定义和继承的套路
Jul 26 NodeJs
nodejs 最新版安装npm 的使用详解
Jan 18 NodeJs
nodejs实现范围请求的实现代码
Oct 12 NodeJs
深入理解NodeJS 多进程和集群
Oct 17 NodeJs
NVM安装nodejs的方法实用步骤
Jan 16 NodeJs
NodeJS读取分析Nginx错误日志的方法
May 14 NodeJs
Nodejs + Websocket 指定发送及群聊的实现
Jan 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
浅析PHP程序防止ddos,dns,集群服务器攻击的解决办法
2013/06/18 PHP
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
2015/04/17 PHP
PHP网络操作函数汇总
2015/05/18 PHP
我整理的PHP 7.0主要新特性
2016/01/07 PHP
安装PHP扩展时解压官方 tgz 文件后没有configure文件无法进行配置编译的问题
2020/08/26 PHP
jscript之Open an Excel Spreadsheet
2007/06/13 Javascript
js定义对象或数组直接量时各浏览器对多余逗号的处理(json)
2011/03/05 Javascript
jQuery中$.click()无效问题分析
2015/01/29 Javascript
Bootstrap+jfinal退出系统弹出确认框的实现方法
2016/05/30 Javascript
JS使用onerror捕获异常示例
2016/08/03 Javascript
浅谈Node.js:fs文件系统模块
2016/12/08 Javascript
Angular在一个页面中使用两个ng-app的方法
2017/02/20 Javascript
JS完成画圆圈的小球
2017/03/07 Javascript
JavaScript使用链式方法封装jQuery中CSS()方法示例
2017/04/07 jQuery
vue.js实现用户评论、登录、注册、及修改信息功能
2020/05/30 Javascript
Node.js 实现简单的接口服务器的实例代码
2017/05/23 Javascript
jQuery实现导航栏头部菜单项点击后变换颜色的方法
2017/07/19 jQuery
Angular4学习教程之HTML属性绑定的方法
2018/01/04 Javascript
webpack4 CSS Tree Shaking的使用
2018/09/03 Javascript
vue中v-for循环给标签属性赋值的方法
2018/10/18 Javascript
详解Vue内部怎样处理props选项的多种写法
2018/11/06 Javascript
vue代码分割的实现(codesplit)
2018/11/13 Javascript
微信小程序基础教程之worker线程的使用方法
2019/07/15 Javascript
解决vue路由name同名,路由重复的问题
2020/08/05 Javascript
Python的设计模式编程入门指南
2015/04/02 Python
python利用thrift服务读取hbase数据的方法
2018/12/27 Python
Pytorch之Variable的用法
2019/12/31 Python
Anaconda3+tensorflow2.0.0+PyCharm安装与环境搭建(图文)
2020/02/18 Python
python中执行smtplib失败的处理方法
2020/07/01 Python
全球最大的在线旅游公司:Expedia
2017/11/16 全球购物
编写类String的构造函数、析构函数和赋值函数
2012/05/29 面试题
运动会广播稿20字
2014/02/18 职场文书
预备党员2014年第四季度思想汇报范文
2014/10/25 职场文书
诚实守信主题班会
2015/08/13 职场文书
Java SSH 秘钥连接mysql数据库的方法
2021/06/28 Java/Android
Java 通过手写分布式雪花SnowFlake生成ID方法详解
2022/04/07 Java/Android