Maison  >  Article  >  base de données  >  À propos de la façon dont NodeJs utilise le module Mysql pour implémenter des exemples de traitement des transactions

À propos de la façon dont NodeJs utilise le module Mysql pour implémenter des exemples de traitement des transactions

黄舟
黄舟original
2017-06-04 10:02:281959parcourir

Cet article présente principalement NodeJs utilisant le module Mysql pour implémenter le traitement des transactions. L'éditeur pense que c'est plutôt bien. Maintenant, je vais le partager avec. vous et donnez également. Utilisons-le tous comme référence. Suivons l'éditeur et jetons un œil

Modules dépendants :

mysql

npm install mysql --save

2.

(ps : le module async peut être remplacé par
npm install async --save
d'autres

Modules Promise tels que bluebird, q, etc.) Parce que le module mysql de

Node.js

encapsule lui-même les transactions C'est trop simple, et l'utiliser directement provoquera un sérieux enfer de rappel, nous avons donc encapsulé deux méthodes, une pour initialiser sql et params, et une pour exécuter des transactions. Initialisez SQL et les paramètres :

Si vous souhaitez exécuter plusieurs instructions SQL, vous avez besoin de :
function _getNewSqlParamEntity(sql, params, callback) {
  if (callback) {
    return callback(null, {
      sql: sql,
      params: params
    });
  }
  return {
    sql: sql,
    params: params
  };
}

Ensuite, je le mets dans mon propre dbHelper. js La fonction
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

de execTrans y est encapsulée, qui est utilisée pour exécuter des transactions

De cette manière, la transaction peut être exécutée :
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);
            }
          })
        }
      })
    });
  });
}

.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn