前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >node-mysql操作transactions的实例

node-mysql操作transactions的实例

作者头像
meteoric
发布于 2018-11-16 09:32:14
发布于 2018-11-16 09:32:14
85400
代码可运行
举报
文章被收录于专栏:游戏杂谈游戏杂谈
运行总次数:0
代码可运行

关于mysql的事务,可查看上一篇文章未尾>>

先更新一条数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UPDATE user_info SET userName = 'kk' WHERE userId = 1;

SELECT * FROM user_info

现在的数据

写一个事务,只选中前面的语句执行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SET AUTOCOMMIT=0;

START TRANSACTION;
SELECT * FROM user_info FOR UPDATE;
COMMIT;

如果使用node.js执行,控制台上会看到待执行的sql处于等待状态:

上面报错,是因为超时了。

如果执行commit后,再执行node.js脚本(执行的是一句更新sql--UPDATE user_info SET userName = ‘张一’ WHERE userId = 1)

这里主要用到了node-mysql-queues,它需要先安装node-mysql

可能因为版本问题吧,它的页面给出的操作方法已经失效了。正确的应该如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * Created with JetBrains WebStorm.
 */
var mysql = require('mysql');

var connection = mysql.createConnection({
    host : 'localhost',
    port : 3306,
    user : 'root',
    password : '123456',
    database : 'test',
    charset : 'UTF8_GENERAL_CI',
    debug : false
});

connection.connect();

//connection.query('CALL proc_simple(1, @a, @b);', function(err, rows, fields) {
//    if (err) {
//       throw err;
//    }
//
//    var results = rows[0];
//    var row = results[0];
//    console.log("userName:",row.uName, "  count:", row.totalCount);
//});

var queues = require('mysql-queues');
const DEBUG = true;
queues(connection, DEBUG);

var trans = connection.startTransaction();
trans.query("UPDATE user_info SET userName = ? WHERE userId = ?", ["张一", 1], function(err, info) {
   if (err) {
       throw err;
       trans.rollback();
   } else {
       trans.commit(function(err, info) {
           console.log(info);
       });
   }
});
trans.execute();
console.log('execute');
//connection.end();

它还支持一次执行多条sql,其实就是把sql语句放入一个数组,然后循环执行该数组内的每条SQL。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var q = client.createQueue();
q.query(...); 
q.query(...);
q.execute();

正常使用的话,请参考如下的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var mysql = require('mysql');
var client = mysql.createConnection({//createClient(已失效) -> createConnection
    user: 'root',
    password: 'root'
});
//Enable mysql-queues
var queues = require('mysql-queues');
const DEBUG = true;
queues(client, DEBUG);
//Start running queries as normal...
client.query(...);

//Now you want a separate queue?
var q = client.createQueue();
q.query(...); 
q.query(...);
q.execute();

client.query(...); //Will not execute until all queued queries (and their callbacks) completed.

//Now you want a transaction?
var trans = client.startTransaction();
trans.query("INSERT...", [x, y, z], function(err, info) {
    if(err)
        trans.rollback();
    else
        trans.query("UPDATE...", [a, b, c, info.insertId], function(err) {
            if(err)
                trans.rollback();
            else
                trans.commit();
        });
});
trans.execute();
//No other queries will get executed until the transaction completes
client.query("SELECT ...") //This won't execute until the transaction is COMPLETELY done (including callbacks)

//Or... as of version 0.3.0, you can do this...
var trans = client.startTransaction();
function error(err) {
    if(err && trans.rollback) {trans.rollback(); throw err;}
}
trans.query("DELETE...", [x], error);
for(var i = 0; i < n; i++)
    trans.query("INSERT...", [ y[i] ], error);
trans.commit(); //Implictly calls resume(), which calls execute()
/* In the case written above, COMMIT is placed at the end of the Queue, yet the
entire transaction can be rolled back if an error occurs. Nesting these queries
was not required. */

query方法的实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Connection.prototype.query = function(sql, values, cb) {
  this._implyConnect();

  var options = {};

  if (typeof sql === 'object') {
    // query(options, cb)
    options = sql;
    cb      = values;
    values  = options.values;

    delete options.values;
  } else if (typeof values === 'function') {
    // query(sql, cb)
    cb          = values;
    options.sql = sql;
    values      = undefined;
  } else {
    // query(sql, values, cb)
    options.sql    = sql;
    options.values = values;
  }

  options.sql = this.format(options.sql, values || []);

  if (!('typeCast' in options)) {
    options.typeCast = this.config.typeCast;
  }

  return this._protocol.query(options, cb);
};

如果第二个参数不是函数,调用format则转换sql,默认将?替换为数组参数的值(一一对应)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Connection.prototype.format = function(sql, values) {
  if (typeof this.config.queryFormat == "function") {
    return this.config.queryFormat.call(this, sql, values, this.config.timezone);
  }
  return SqlString.format(sql, values, this.config.timezone);
};

默认的format方法实现如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SqlString.format = function(sql, values, timeZone) {
  values = [].concat(values);

  return sql.replace(/\?/g, function(match) {
    if (!values.length) {
      return match;
    }

    return SqlString.escape(values.shift(), false, timeZone);
  });
};

也可以使用自定义的函数进行处理,在创建连接的时候,传入queryFormat参数即可。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2012-12-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
go语言学习-mysql
mysql使用 sql语句 DROP TABLE IF EXISTS `person`; CREATE TABLE `person` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `age` int(11) DEFAULT NULL, `IsBoy` tinyint(4) DEFAULT NULL, PRIMARY KEY (`id`) ) DEFAULT CH
solate
2019/07/22
4510
搭建node服务(二):操作MySQL
要想进行数据库操作就需要和数据库建立连接,然后通过连接进行数据库的操作。MySQL的数据库连接方式有以下几种:
宜信技术学院
2020/06/03
1.8K0
搭建node服务(二):操作MySQL
Vertx操作MySQL
Reactive MySQL客户端是MySQL的客户端,其API专注于可伸缩性和低开销。
是小张啊喂
2021/02/20
1.6K0
实时会话系统实现(1) --- http轮询方式
最近一直在开发博客小程序,最近开发好友系统和实时会话系统。其实众所周知会话系统正常的业务逻辑应该是用户A给用户B发送一个消息,用户A发送后用户B马上可以接收到并在页面渲染出来,而且最新的消息应该是在页面最底部。那要实现这个实时会话有什么方法呢?我们通过本系列文章可以学到什么知识点呢?我们可以先看看本系列文章涉及的知识点:
创译科技
2019/11/14
1.7K0
实时会话系统实现(1) --- http轮询方式
GoLang如何操作mysql
Go原生提供了连接数据库操作的支持,在用 Golang进行开发的时候,如果需要在和数据库交互,则可以使用database/sql包。这是一个对关系型数据库的通用抽象,它提供了标准的、轻量的、面向行的接口。
大忽悠爱学习
2022/08/23
8710
GoLang如何操作mysql
MySQL自定义函数与存储过程示例
函数:可以完成特定功能的一段SQL集合。MySQL支持自定义函数来完成特定的业务功能。 创建自定义函数(User Defined Function 简称UDF)的语法如下:
星哥玩云
2022/08/17
1.7K0
Node.js+Express+Mysql 实现增删改查
这次选用nodejs+express+mysql 使用http作为客户端,express框架搭建服务端,从而实现数据的增删改查。这篇文章可以算作上篇文章的升级篇,加入了和数据库的交互。
用户5005176
2021/08/11
2.2K0
Node 架构从三层到 N 层,实现代码重用和解耦
作者:郭泽豪 三层架构(3-tier Application)通常意义上是将整个业务应用划分为:控制层(Controller)、业务逻辑层(Service)以及数据访问层(Dao),三层架构在Jav
serena
2017/08/29
7.7K1
Node 架构从三层到 N 层,实现代码重用和解耦
Python 操作 MySQL数据库
    可以直接从MySQL官方网站下载最新版本。MySQL是跨平台的,选择对应的平台下载安装文件,安装即可。 如果是Windows用户,那么安装过程非常简单,直接根据向导一步一步操作即可。 如果是 Linux 用户,安装过程也是相当简单的。
py3study
2020/01/06
1.3K0
NodeJS下连接mysql操作(增删查改)
NodeJS下要使用mySql需要安装mysql依赖,输入命令行:npm install mysql --save NodeJS中连接mysql数据库的简单方法我所知道的有createConnection(Object)方法和创建连接池 createPool(Object),这两个方法的参数相同,都接受一个对象作为参数,该对象有五个常用的属性host,port,user,password,database。与php中链接数据库的参数相同。属性列表如下:
bering
2019/12/03
1.9K0
C#封装的Sqlite访问类
C#封装的Sqlite访问类,要访问Sqlite这下简单了,直接调用此类中的方法即可
艳艳代码杂货店
2021/10/27
1.2K0
SQLite事务 SQLite插入多条语句为什么这么慢?.net (C#)
今天有个朋友测试 SQLite,然后得出的结论是: SQLite 效率太低,批量插入1000条记录,居然耗时 2 分钟! 下面是他发给我的测试代码。我晕~~~~~~   using System.Data; using System.Data.Common; using System.Data.SQLite; // 创建数据库文件 File.Delete("test1.db3"); SQLiteConnection.CreateFile("test1.db3"); DbProviderFactory f
hbbliyong
2018/03/05
2K0
node-mysql文档翻译
如果需要以前的版本0.9.x系列的文档,请访问v0.9 branch. 有时你可以从github中安装最新版本的node-mysql,具体怎么做请参考下面的示例:
stys35
2020/12/17
1.6K0
解决SqlTransaction用尽的问题
有时候程序处理的数据量比较小时,四平八稳,一切安然无恙,但数据量一大,原先潜伏的问题就暴露无遗了。
全栈程序员站长
2022/08/19
2430
Nodejs学习笔记(四)--- 与MySQL交互(felixge/node-mysql)
简介和安装   Node.js与MySQL交互操作有很多库,具体可以在 https://www.npmjs.org/search?q=mysql  查看。   我选择了felixge/node-mys
Porschev
2018/01/16
2.3K0
Nodejs学习笔记(四)--- 与MySQL交互(felixge/node-mysql)
Ruby 操作 Mysql(2)
在对安全要求更严格的环境下,可以使用 SSL 加密连接,前提是客户端和服务端都得编译对 SSL 的支持
franket
2021/10/19
5980
node封装mysql操作
        node是基于异步的,因此在进行数据库查询操作的通常是通过回调来操作查询结果。但是在有了es7的async/await,基本不再需要回调了,所以本篇是基于async/await对mysql进行一次操作封装,让查询更加方便。(node版本需>=7.0)。 
用户2038589
2018/09/06
1.5K0
node封装mysql操作
mysql 连接池的实现
涉及后端的数据交互管理的时候,我们在应用层总是希望将一些过程进行封装进行规模化管理,池化技术基本就是来干这种事情的,线程池,内存池,连接池,请求池等等都是来干这种事情的,当然如果从算法层面来说,这种就是用空间来换时间的做法。我们的很多著名的算法也是基于这样的方式来优化的,著名的 KMP 算法,通过维护一个 next 数组,来降低算法的时间复杂度。
ge3m0r
2024/05/26
1210
Spring @Transactional 注解是如何执行事务的?
相信小伙伴一定用过 @Transactional 注解,那 @Transactional 背后的秘密又知道多少呢?
程序员小航
2021/07/09
1.9K0
saltstack returners 结果转存
returners 是saltstack对minion执行操作后,对返回的数据进行存储,可以存储到一个文件或者数据库当中。 支持的returners http://docs.saltstack.cn/zh_CN/latest/ref/returners/all/index.html 官方例子: https://github.com/saltstack/salt/tree/develop/salt/returners 参考:http://lixcto.blog.51cto.com/4834175/143
程序员同行者
2018/07/02
1.3K0
相关推荐
go语言学习-mysql
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验