nodejs mysql事务处理_关于NodeJs如何使用Mysql模块实现事务处理实例

本篇文章主要介绍了NodeJs使用Mysql模块实现事务处理 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

依赖模块:

1. mysqlnpm install mysql --save

2. asyncnpm 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.");

}

})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何正确的通过 C++ Primer 学习 C++?(转自知乎)

作者:dawnmist链接:https://www.zhihu.com/question/32087709/answer/54936403来源:知乎著作权归作者所有,转载请联系作者获得授权。个人经验,C primer 第一次可以跳着看。关键是要尽快用起来,在使用中熟练…

Androidstudio连mysql_MySQL数据库之Android Studio使用JDBC远程连接mysql的注意事项(附示例)...

本文主要向大家介绍了MySQL数据库之Android Studio使用JDBC远程连接mysql的注意事项(附示例) ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助。JDBC为java程序访问各种类型的关系型数据库提供了统一的接口,用户不必针对不同数…

纪中2016.10.6比赛不明总结

100<分数<310 ———————————————————————————————————— 期望值&#xff1a; |T1&#xff1a;100/T2&#xff1a;10/T3&#xff1a;100/T4&#xff1a;100 ————————————————————————————————————…

zendstudio快捷键收录

360截屏快捷键&#xff1a;ctrlshiftxzendstudio:注释代码&#xff1a;ctrlshift/删除光标所在行&#xff1a;ctrlD复制当前行&#xff1a;ctrlalt↓上下行互换:alt↑/↓代码格式化&#xff1a;CtrlshiftF&#xff0c;缩进&#xff1a;tab代码折叠快捷键&#xff1a;Ctrl/(小键…

centos8.2安装mysql_centos8安装mysql

通过以root用户或者具有sudo特权的用户身份使用CentOS软件包管理器(dnf)来安装MySQL 8.0# dnf install mysql安装好后&#xff0c;这里注意需要修改两个文件的权限&#xff0c;否则启动失败。# chown -R mysql:mysql /var/run/mysqld# chmod -R 777 /var/lib/mysql设置为开机自…

dedecms代码研究三

上次&#xff0c;我们从dedecms的index.PHP文件中了解到了很多信息&#xff0c;也提出了一些问题&#xff1a; 1&#xff09;加载了/include/common.inc.php&#xff0c;里面做了哪些工作&#xff1f;2&#xff09;/include/arc.partview.class.php到底是干什么的&#xff0c;/…

idea快捷操作_IDEA插件系列 快捷键神器!Key Promoter X

今天起&#xff0c;会陆续给大家介绍一些IDEA的插件。正所谓工欲善其事必先利其器&#xff0c;一款好的插件可以帮我们提升开发效率&#xff0c;或者提升使用IDEA的幸福感&#xff01;今天要推荐的第一款插件 Key Promoter X 。相信很多新手甚至老手&#xff0c;对IDEA中的快捷…

《开讲啦》 20160910 颜宁:女科学家去哪儿了?

视频地址&#xff1a; 《开讲啦》 20160910 颜宁&#xff1a;女科学家去哪儿了&#xff1f; 果然是女神科学家&#xff0c;讲了一些我很感兴趣的东西&#xff0c;让我也体会到了女神的气质&#xff0c;有点感触&#xff0c;这个节目不错&#xff0c;可以追。 颜宁教授于2016年5…

if __name__ == __main__:什么意思_秒懂Python编程中的if __name__ == 'main' 的作用和原理...

来源&#xff1a;菜鸟分析 链接&#xff1a;https://zhuanlan.zhihu.com/p/34112508一天偶然发现知乎上有篇关于对python编程中的if __name__ main的理解陈述&#xff0c;看完之后&#xff0c;自己觉得不够简单明了&#xff0c;于是在其文章底部写了一句话&#xff0c;突然收获…

4.openstack之mitaka搭建glance镜像服务

部署镜像服务 一&#xff1a;安装和配置服务 1.建库建用户 mysql -u root -p CREATE DATABASE glance; GRANT ALL PRIVILEGES ON glance.* TO glancelocalhost IDENTIFIED BY 密码; GRANT ALL PRIVILEGES ON glance.* TO glance% IDENTIFIED BY 密码; flush privileges; 2.keys…

mysql php 变量赋值,在MySQL UPDATE(PHP / MySQL)中使用变量

I am using this code so I can update a record in database:$query mysql_query("UPDATE articleSET com_count ". $comments_countWHERE article_id .$art_id ");My question is: How can I use variables in a MySQL UPDATE statement.解决方案$query m…

mongodb 教程一

mongodb是nosql&#xff08;not only sql&#xff09;的一种方式 。是对不同于传统的关系型数据库的数据库管理系统的统称。 NoSQL - 代表着不仅仅是SQL- 没有声明性查询语言- 没有预定义的模式-键 - 值对存储&#xff0c;列存储&#xff0c;文档存储&#xff0c;图形数据库- 最…

java mysql 回滚_Java 中对数据库操作时的 回滚

Connection connnull;conn.rollback()就可以回滚//用jdbc连接数据库//举例子&#xff0c;比如你在写一个级联删除的方法的时候&#xff0c;为了保证数据完整性&#xff0c;删除的时候一定要确定该删的都删了才行&#xff0c;否则就要回滚&#xff0c;下面是删除方法的例子&…

向文件中追加内容

#echo abcbedf>>a.txt 将abcdef追加到a.txt文件末尾 往文件中写入内容&#xff0c;比如原来的a.txt文件内容是aaaaa&#xff0c; #echo bbbbb>a.txt&#xff0c;这个是bbbbb把a.txt原来的内容替换 这里注意 >是覆盖&#xff0c;>>是追加。 如果为多行输入,需…

kali linux改中文_【亲测实验】kali linux 2020 设置为中文方法

kali 2020.1可用进入我们的正题&#xff0c;修改为中文的步骤1.更换更新源打开终端&#xff0c;输入下边命令打开更新源的文件vim /etc/apt/sources.list在文件结尾加入下边更新源#中科大deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contribdeb-src http:…

php取整函数ceil,floor,round,intval函数的区别

1、ceil — 进一法取整说明float ceil ( float $value )返回不小于 value 的下一个整数&#xff0c;value 如果有小数部分则进一位。ceil() 返回的类型仍然是 float&#xff0c;因为 float 值的范围通常比 integer 要大。ceil() 例子 <?php echo ceil(4.3); // 5 echo ceil…

mysql的源码目录_Mysql DBA系统学习(2)了解mysql的源码目录及源文件

了解mysql的源码目录包括客户端代码&#xff0c;服务端代码&#xff0c;测试工具和其他库文件Bdb 伯克利DB表引擎BUILD 构建工程的脚本Client 客户端Cmd-line-utils 命令行工具Config 构建工程所需的一些文件Dbug Fred Fish的调试库Docs 文档文件夹Extra 一些相对独立的次要的工…

开始我的blog之旅

这是我第一次开始写blog的时刻&#xff0c;我也想好了怎么开始&#xff0c;鉴于我喜欢刨根问底的原则&#xff0c;我决定要翻开C语言&#xff0c;重新复习。同时以写blog的形式来印证。 写作路线嘛&#xff0c;就按照《C Primer Plus》第五版的章节套路来&#xff0c;中间在参杂…

ubuntu 破解mysql密码_Ubuntu下忘记MySQL root密码解决方法

Linux下忘记MySQL root密码解决方法忘了mysql密码&#xff0c;从网上找到的解决方案记录在这里。编辑mysql的配置文件/etc/mysql/my.cnf&#xff0c;在[mysqld]段下加入一行“skip-grant-tables”121201191255521.png重启mysql服务ubuntu:~$ sudo service mysql restartmysql s…

面向对象编程其实很简单——Python 面向对象(初级篇)

在Python教学中发现&#xff0c;很多同学在走到面向对象编程这块就开始蒙圈了&#xff0c;为了帮助大家更好的理解面向对象编程并其能将其用到自己的开发过程中&#xff0c;特写此文。 概述 面向过程&#xff1a;根据业务逻辑从上到下写垒代码 函数式&#xff1a;将某功能代码…