This article mainly introduces NodeJs using the Mysql module to implement transaction processing. The editor thinks it is quite good. Now I share it with everyone and also give Let’s all use it as a reference. Let’s follow the editor to take a look.
Dependent modules:
1. mysql
npm install mysql --save
2. async
npm install async --save
( ps: The async module can be replaced by Other Promise modules such as bluebird, q, etc.)
Because the mysql module of Node.js itself is too simple to encapsulate transactions, and Direct use will cause serious callback hell, so we encapsulated two methods, one for initializing sql & params, and one for executing transactions.
Initialize sql & params:
function _getNewSqlParamEntity(sql, params, callback) { if (callback) { return callback(null, { sql: sql, params: params }); } return { sql: sql, params: params }; }
If you want to execute multiple sql statements, you need:
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
Then I encapsulated execTrans in my own dbHelper.js Function, used to execute transactions
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); } }) } }) }); }); }
In this way, transactions can be executed:
execTrans(sqlParamsEntity, function(err, info){ if(err){ console.error("事务执行失败"); }else{ console.log("done."); } })
The above is the detailed content of Detailed introduction to the case code on how NodeJs uses the Mysql module to implement transaction processing. For more information, please follow other related articles on the PHP Chinese website!