JavaScript

超轻量级php框架startmvc

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

更新时间:2020-05-14 23:24:01 作者:startmvc
依赖模块:1.mysql:https://github.com/felixge/node-mysqlnpminstallmysql--save2.async:https://github.com/caolan/a

依赖模块:

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 mysql 事务 nodejs mysql事务处理