日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

nodejs mysql模块_NodeJs使用Mysql模块实现事务处理

發布時間:2025/3/8 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nodejs mysql模块_NodeJs使用Mysql模块实现事务处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

依賴模塊:

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});functionexecTrans(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);throwtErr;

});

}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模块实现事务处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。