node回调函数的方式使得数据库事务貌似并没有像java、php那样编写简单,网上找了一些事务处理的封装并没有达到自己预期的那样简单编写,还是自己封装一个吧。
封装的大体思路很简单:函数接受一个事务处理的函数,如何处理事务的逻辑由该函数确定,而不是像网上封装的事务是对组装多条预处理SQL和参数。该事务处理函数要求返回Promise。这样我们就可以通过该Promise来确定是提交事务还是回滚事务了。
根据上述思路,实现代码:

let mysql = require('mysql')
let config = require('../config')let pool = mysql.createPool(config.database) //config.databa数据库配置
let trans = (tran) => {return new Promise((resolve, reject) => {  //返回promise提供事务成功与失败的接口pool.getConnection((err, conn) => {if(err) {reject(err)}else {conn.beginTransaction((err) => { //开始事务处理if(err) {conn.release()reject(err)}else {let promise = tran(conn)  //调用事务处理函数promise.then(result => {conn.commit(err => {  //事务处理函数resolve则提交事务if(err) {reject(err)}else {resolve(result)}})}).catch(err => {conn.rollback(() => {  //事务处理函数reject则回滚事务conn.release()reject(err)})})}})}})})
}

事务处理函数接受数据库连接对象conn,这里我封装了数据库执行语句:

trans.query = (conn, sql, params) => {return new Promise((resolve, reject) => {conn.query(sql, params,(err, result) => {if(err) {reject(err)}else {resolve(result)}})})
}

上面事务处理封装完成,应用就和正常Promise使用相同:

trans((conn) => {return trans.query(conn, db_user.register.user, [username, password, new Date().getTime()]).then(result => {return trans.query(conn,db_user.login, [username])}).then(result => {return trans.query(conn,db_user.register.profile,[result[0].id, nickname])})}).then(result=>{console.log(‘事务提交成功’)}).catch(err => {console.log(‘事务提交失败’)})

上述案例是我截取项目的一段代码,从上面代码显然可以很容易封装自己的逻辑,可以执行不同路径的事务流程。

转载于:https://blog.51cto.com/janwool/2094623

Node Mysql事务处理封装相关推荐

  1. node mysql 模块 封装_node.js基于工厂方法的mysql模块封装

    有空写完再补说明,手上的事情比较多,以后边做边完善接口. app.js var config = require('./config'); function Query(strquery,option ...

  2. mysql 事物封装_mysqls 一个node对mysql的封装库 链式调用、支持事务

    在我自己的平常开发中很少有见到javascript对sql的封装比较好的库(找了一圈也没找到.应该是暂时我没发现),因此前期的项目中根据自己的项目情况实现了一套封装方法. 最近我准备写一个这样的库,基 ...

  3. mysql事务处理用法与实例详解

    MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关1.MyISAM:不支持事务,用于只读程序提高性能 2.InnoDB:支持ACID事务.行级锁.并发 3.Berkeley DB: ...

  4. mysql事务处理 begin_mysql 事务处理

    mysql 事务处理(表的引擎必须是 innodb / BDB) 主要是两种两法:推荐用第一种 1.用 begin,rollback,commit 来实现 begin 开始一个事务 rollback ...

  5. node与mysql开源_node与mysql的相互使用————node+mysql

    node与mysql的相互使用----node+mysql 为什么选node???因为我是个前端. 为什么选mysql???因为成熟,稳定,听说容易学. 一.mysql数据库: mysql下载和使用我 ...

  6. node+Mysql,数据库时区显示正确,查询时却显示另一个时区

    问题: 1.node+Mysql,查看数据库时区显示正确,但查询时,显示的确是另一个时区的时间. 2.前端调用接口返回:startTime: "2020-03-04T17:53:55.000 ...

  7. MySQL事务处理与事务隔离(锁机制)

    转载:http://blog.csdn.net/qq_26525215/article/details/52146529 MySQL 事务处理 简单介绍事务处理: MySQL 事务主要用于处理操作量大 ...

  8. mysql pdo 事务处理_php中pdo的mysql事务处理实例

    php+mysql事务处理的几个步骤: 1.关闭自动提交 2.开启事务处理 3.有异常就自动抛出异常提示再回滚 4.开启自动提交 注意: mysql只有这个InnoDB驱动是支持事务处理的,默认MyI ...

  9. python mysql操作封装库_python封装mysq操作,进行数据库的增删改

    python操作mysql进行封装,封装的好处我就不提了,以下是我做项目时的一个封装,大家可以根据实际需要进行自己的一个封装 我封装的内容: 1.数据库的配置文件 2.获取数据配置文件的地址 3.连接 ...

最新文章

  1. Qt学习笔记,Qt程序架构设计要旨
  2. iOS UIVisualEffectView毛玻璃亮度不符合要求
  3. 如何自定义IHttpHandler
  4. Spring3向Spring4升级过程中quartz修改
  5. S3C6410启动模式介绍
  6. Java学习笔记004——接口、克隆、回调、内部类
  7. 计算机系统结构安全检测,信息安全体系结构安全测评实验报告.doc
  8. CentOS查看硬件信息
  9. ogre 1.9SDK阅读笔记
  10. sqlloader 直接路径和常规路径_sqlloader
  11. enfp工具箱怎么用_小丸工具箱使用技巧详细图解,值得各位学习
  12. English 900 英语九百句
  13. oracle按顺序新增字段,Oracle 修改字段顺序的两种方法
  14. msl3等级烘烤时间_MSL 湿敏等级对应表
  15. IO端口和IO内存映射【waitting】
  16. 【Python学习】(9)[Errno 2]No such file or directory:'calibri.ttf'
  17. 激光 pm2.5传感器 攀藤科技 stm32 调试通过
  18. vue-router 是什么?它有哪些组件
  19. 任天堂服务器维护12月1,任天堂明星大乱斗12月14日更新公告 1.2.0更新补丁说明...
  20. android手机小内存,世界最小Android手机问世 仅2.4英寸512MB内存

热门文章

  1. Nginx-04:Nginx配置实例之反向代理1
  2. linux线程下的读写锁
  3. case 关键字后面的的值有什么要求吗?
  4. 《linux内核完全剖析:基于0.12内核》读书笔记一
  5. springmvc十二:@PathVariable
  6. python三十:time模块
  7. Python学习笔记-DNS域名轮循业务监控
  8. [转]LIB和DLL的区别与使用
  9. 每周一书《Oracle 12 c PL(SQL)程序设计终极指南》
  10. java、上转型对象