全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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
});

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  # 事务  # mysql事务处理  # node使用mysql获取数据库数据中文乱码问题的解决  # node+express框架中连接使用mysql(经验总结)  # Node.js使用MySQL连接池的方法实例  # Node.JS使用Sequelize操作MySQL的示例代码  # 解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3  # 初步使用Node连接Mysql数据库  # MySQL数据库node使用详解  # 装了  # 自己的  # 会有  # 我在  # 你要  # 多条  # 大家多多  # 就可以  # 则需  # null  # var  # strong  # params  # amp  # function  # return  # _getNewSqlParamEntity  # sqlParamsEntity  # push  # callback 


相关文章: 临沂网站制作公司有哪些,临沂第四中学官网?  临沂网站制作企业,临沂第三中学官方网站?  建站之星后台密码遗忘?如何快速找回?  定制建站价位费用解析与套餐推荐全攻略  简历在线制作网站免费,免费下载个人简历的网站是哪些?  制作销售网站教学视频,销售网站有哪些?  如何通过wdcp面板快速创建网站?  Swift中swift中的switch 语句  北京的网站制作公司有哪些,哪个视频网站最好?  如何高效完成独享虚拟主机建站?  教学网站制作软件,学习*后期制作的网站有哪些?  制作门户网站的参考文献在哪,小说网站怎么建立?  c# await 一个已经完成的Task会发生什么  网站制作服务平台,有什么网站可以发布本地服务信息?  如何快速完成中国万网建站详细流程?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  如何快速搭建高效可靠的建站解决方案?  XML的“混合内容”是什么 怎么用DTD或XSD定义  一键网站制作软件,义乌购一件代发流程?  建站主机SSH密钥生成步骤及常见问题解答?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  Android滚轮选择时间控件使用详解  建站之星代理平台如何选择最佳方案?  常州企业建站如何选择最佳模板?  制作充值网站的软件,做人力招聘为什么要自己交端口钱?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  浅谈Javascript中的Label语句  TestNG的testng.xml配置文件怎么写  如何快速上传建站程序避免常见错误?  h5网站制作工具有哪些,h5页面制作工具有哪些?  建站主机解析:虚拟主机配置与服务器选择指南  建站之星如何助力企业快速打造五合一网站?  ,怎么用自己头像做动态表情包?  *服务器网站为何频现安全漏洞?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  高端网站建设与定制开发一站式解决方案 中企动力  建站主机选购指南:核心配置优化与品牌推荐方案  如何在IIS7中新建站点?详细步骤解析  建站主机选择指南:服务器配置与SEO优化实战技巧  建站主机助手选型指南:2025年热门推荐与高效部署技巧  建站ABC备案流程中有哪些关键注意事项?  定制建站策划方案_专业建站与网站建设方案一站式指南  如何挑选高效建站主机与优质域名?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  网站app免费制作软件,能免费看各大网站视频的手机app?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  建站之家VIP精选网站模板与SEO优化教程整合指南  如何通过商城自助建站源码实现零基础高效建站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。