NodeJs使用Mysql模組實現交易處理

來源:互聯網
上載者:User

標籤:

相依模組:

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模組實現交易處理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.