欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-12-01 16:26:04
依赖模块: 1. mysql: npm install mysql --save 2. async: npm install async --s...

依赖模块:

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

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