当前位置: 移动技术网 > IT编程>开发语言>JavaScript > NodeJs使用Mysql模块实现事务处理实例

NodeJs使用Mysql模块实现事务处理实例

2018年04月28日  | 移动技术网IT编程  | 我要评论

依赖模块:

1. mysql:

npm install mysql --save

2. 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.");
}
})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网