内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

怎么在NodeJs中使用Mysql模塊對(duì)事務(wù)進(jìn)行處理

怎么在NodeJs中使用MySQL模塊對(duì)事務(wù)進(jìn)行處理?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

創(chuàng)新互聯(lián)是專業(yè)的內(nèi)江網(wǎng)站建設(shè)公司,內(nèi)江接單;提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行內(nèi)江網(wǎng)站開發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!

依賴模塊:

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等) 

因?yàn)镹ode.js的mysql模塊本身對(duì)于事務(wù)的封裝過(guò)于簡(jiǎn)單,而且直接使用會(huì)有很嚴(yán)重callback hell,故我們封裝了兩個(gè)方法,一個(gè)用來(lái)初始化sql & params,一個(gè)用來(lái)執(zhí)行事務(wù)。

初始化sql & params:

function _getNewSqlParamEntity(sql, params, callback) {
  if (callback) {
    return callback(null, {
      sql: sql,
      params: params
    });
  }
  return {
    sql: sql,
    params: params
  };
}

如果你要執(zhí)行多條sql語(yǔ)句,則需要:

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, []));

//...更多要事務(wù)執(zhí)行的sql

然后我在我自己的dbHelper.js里封裝了execTrans的函數(shù),用來(lái)執(zhí)行事務(wù)

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("開始執(zhí)行transaction,共執(zhí)行" + sqlparamsEntities.length + "條數(shù)據(jù)");
      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("事務(wù)失敗," + 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("執(zhí)行事務(wù)失敗," + err);
              connection.rollback(function (err) {
                console.log("transaction error: " + err);
                connection.release();
                return callback(err, null);
              });
            } else {
              connection.release();
              return callback(null, info);
            }
          })
        }
      })
    });
  });
}

這樣就可以執(zhí)行事務(wù)了:

execTrans(sqlParamsEntity, function(err, info){
if(err){
  console.error("事務(wù)執(zhí)行失敗");
}else{
  console.log("done.");
}
})

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。

當(dāng)前文章:怎么在NodeJs中使用Mysql模塊對(duì)事務(wù)進(jìn)行處理
文章源于:http://m.rwnh.cn/article20/jdgojo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、網(wǎng)站制作、App設(shè)計(jì)微信小程序、品牌網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化
灌云县| 泰安市| 铜陵市| 论坛| 合山市| 乌海市| 绥德县| 长垣县| 房山区| 陆川县| 左贡县| 西乌珠穆沁旗| 剑川县| 武定县| 长岛县| 祁东县| 荣昌县| 金沙县| 东乡族自治县| 邹城市| 泽库县| 迁西县| 都江堰市| 南宫市| 桐乡市| 新巴尔虎右旗| 奇台县| 杭州市| 商城县| 华坪县| 游戏| 舒城县| 体育| 东阳市| 城固县| 金溪县| 廉江市| 东安县| 山西省| 莆田市| 葵青区|