node连接mysql查询事务处理的实现

目录
  • 进入正题 mysql 增删改查
  • mysql 事务处理

自己用 mysql 很多次的,然后又是主玩nodejs的.专门写一篇文章来说说nodejs连接mysql数据库。在使用之前,请检查计算机是否具有一下环境!

  • nodejs 执行环境。
  • mysql数据库环境(下载地址)。
  • navicat 连接 mysql 数据库的图形化操作软件。(非必要)

进入正题 mysql 增删改查

首先,我们去下载一个叫mysql的依赖包,这个包就是通过 nodejs 代码去连接数据库,从而操作数据库。

创建一个文件夹,快速生成pakeage.json文件

D:\nodejs_mysql>npm init -y  # 快速传创建包管理文件

安装依赖

D:\nodejs_mysql>npm i mysql -D # 安装mysql 依赖包

创建一个 index.js 文件,代码如下

const mysql = require("mysql");

// 创建 一个mysql 连接池
const pool = mysql.createPool({
  host: "127.0.0.1", // 连接数据库的地址 127.0.0.1 为本地的mysql
  user: "root", //  连接数据库的用户名 root 是最高权限
  password: "", //  连接数据库的密码
  database: "apm", // 操作的数据库名
  port: "3306", // 连接mysql的端口号
  multipleStatements: true, // 运行一次执行多条sql语句 可以忽略此项
});

function select() {
  // 请求连接mysql
  pool.getConnection((err, connection) => {
    // 未连接成功 报错
    if (err) throw err;
    // 得到一个 连接对象 调用 query 方法 可以执行 sql 语句
    let sql = "select * from goods";
    // 运行sql语句 query 第二个参数为 sql语句需要的参数 ,没有可以不写
    connection.query(sql, (errors, results, fields) => {
      // 释放连接
      connection.release();
      // 如果运行sql语句有报错 抛出错误
      if (errors) throw errors;
      console.log(results);
      console.log(fields);
    });
  });
}

select();

以上的代码是查询 数据库apm一个数据表goods的数据。results为从数据库取出的数据。

封装方法 使用Promise来查询数据库

//  index.js
// ... 忽略前面的创建mysql连接池代码
function query(sql, params) {
  return new Promise((resolve, reject) => {
    pool.getConnection((err, connection) => {
      // 未连接成功 报错
      if (err) return reject(err);
      // 得到一个 连接对象 调用 query 方法 可以执行 sql 语句
      // 运行sql语句 query 第二个参数为 sql语句需要的参数 ,没有可以不写
      connection.query(sql, params, (errors, results, fields) => {
        // 释放连接
        connection.release();
        // 如果运行sql语句有报错 抛出错误
        if (errors) return reject(errors);
        resolve(results);
      });
    });
  });
}

query("select * from goods", null).then((result) => {
  console.log(result);
});
module.exports = {
  query,
};

使用

// data.js
const index = require("./index.js");
var sql = "select * from goods";
index
  .query(sql, null)
  .then((result) => {
    // do anything ....
  })
  .catch((err) => {
    // error
    console.log(err);
  });

这样就向外暴露了一个数据库运行 sql 的接口。通过promise使用.then这种链式调用的代码风格。

mysql 事务处理

说到 mysql 事务,我也就不做过多介绍了,这里给个友情链接方便大家学习。MySQL 事务处理

我们直接步入正题,使用promise来封装 mysql 的事务处理.

// index.js

// .... 部分创建 pool 的代码

/**
 * mysql 事务处理
 * @param {Array} sqls 需要执行的sql语句
 * @param {Array} params 对应上面sql语句的参数
 * @returns {Promise} 返回一个Promise
 */
function transaction(sqls, params) {
  return new Promise((resolve, reject) => {
    pool.getConnection(function (err, connection) {
      // 连接失败 promise直接返回失败
      if (err) {
        return reject(err);
      }
      // 如果 语句和参数数量不匹配 promise直接返回失败
      if (sqls.length !== params.length) {
        connection.release(); // 释放掉
        return reject(new Error("语句与传值不匹配"));
      }
      // 开始执行事务
      connection.beginTransaction((beginErr) => {
        // 创建事务失败
        if (beginErr) {
          connection.release();
          return reject(beginErr);
        }
        console.log("开始执行事务,共执行" + sqls.length + "条语句");
        // 返回一个promise 数组
        let funcAry = sqls.map((sql, index) => {
          return new Promise((sqlResolve, sqlReject) => {
            const data = params[index];
            connection.query(sql, data, (sqlErr, result) => {
              if (sqlErr) {
                return sqlResolve(sqlErr);
              }
              sqlReject(result);
            });
          });
        });
        // 使用all 方法 对里面的每个promise执行的状态 检查
        Promise.all(funcAry)
          .then((arrResult) => {
            // 若每个sql语句都执行成功了 才会走到这里 在这里需要提交事务,前面的sql执行才会生效
            // 提交事务
            connection.commit(function (commitErr, info) {
              if (commitErr) {
                // 提交事务失败了
                console.log("提交事务失败:" + commitErr);
                // 事务回滚,之前运行的sql语句不生效
                connection.rollback(function (err) {
                  if (err) console.log("回滚失败:" + err);
                  connection.release();
                });
                // 返回promise失败状态
                return reject(commitErr);
              }

              connection.release();
              // 事务成功 返回 每个sql运行的结果 是个数组结构
              resolve(arrResult);
            });
          })
          .catch((error) => {
            // 多条sql语句执行中 其中有一条报错 直接回滚
            connection.rollback(function () {
              console.log("sql运行失败: " + error);
              connection.release();
              reject(error);
            });
          });
      });
    });
  });
}
module.exports = {
  transaction,
};

之后只需要调用这个方法就可以执行 mysql 事务了

// data.js
const index = require("./index.js");
var sqls = [
  "delete from goods where goods_id = ?", // 删除 语句
  "update goods set num = ? where goods_id = ?;", // 更新语句
];
var params = [
  [1], // parmas 是数组格式 与sqls里的sql语句里 ? 一一对应
  [5, 3],
];

index
  .transaction(sqls, params)
  .then((arrResult) => {
    // do anything ....
  })
  .catch((err) => {
    // error
    console.log(err);
  });

到此这篇关于node连接mysql查询事务处理的实现的文章就介绍到这了,更多相关node连接mysql查询事务处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mysql事务隔离级别详情

    serializable 串行化(无问题) 事务必须以顺序的方式执行,前一个事务提交之前后面的事务无法进行提交,最安全,但是不能并发操作,导致效率低下. repeatab read 可重复读(默认隔离级别)(幻读) 在一个事务未提交之前,里面不论执行多少次查询,查询的结果都一样(即使这条记录被别的事务修改过)但是可能会出现幻读 read committed 读已提交(不可重复度,幻读) 在当前事务中别的事务提交的数据可以看到,那么可能会导致不可重复读(另一个线程提交数据后当前线程可以看到,然后就

  • MySQL数据库事务transaction示例讲解教程

    目录 1.什么是事务? 2.和事务相关的语句只有这3个DML语句:insert.delete.update 3.假设所有的业务都能使用1条DML语句搞定,还需要事务机制吗? 4.事务的原理 5.事务的四大特性:ACID 6.关于事务之间的隔离性 1)第一级别:读未提交(read uncommitted) 2)第二级别:读已提交(read committed) 3)第三级别:可重复读(repeatable read) 4)第四级别:序列化读/串行化读(serializable) 7.演示事务的隔离

  • 关于MySQL与Golan分布式事务经典的七种解决方案

    目录 1.基础理论 1.1 事务 1.2 分布式事务 2.分布式事务的解决方案 2.1 两阶段提交/XA 2.2 SAGA 2.3 TCC 2.4 本地消息表 2.5 事务消息 2.6 最大努力通知 2.7 AT事务模式 3.异常处理 3.1 异常情况 3.2 子事务屏障 3.3 子事务屏障原理 3.4 子事务屏障小结 4.分布式事务实践 4.1 一个SAGA事务 4.2 处理网络异常 4.3 处理回滚 5.总结 前言: 随着业务的快速发展.业务复杂度越来越高,几乎每个公司的系统都会从单体走向分

  • mysql 事务解析

    事务(transaction) 事务是业务逻辑的一个基本的单元组成. 每一个事务由一条条sql语句组成. 和事务相关的语句(insert,delete,update)这些DML语句 事务的存在保证了数据的安全性. 事务机制: 每一次执行DML语句都会记录操作,但不会修改数据,等到所有DML执行, 最后提交事务(删除记录,修改硬盘数据)或者回滚事务(删除记录,不修改数据). 事务由四大特性:ACID A:原子性,事务是最小的工作单元 C:一致性,事务中的DML语句要么都执行成功,要么都失败 I:隔

  • 一文搞懂MySQL XA如何实现分布式事务

    目录 前言 XA 协议 如何通过MySQL XA实现分布式事务 前言 MySQL支持单机事务的良好表现毋庸置疑,那么在分布式系统中,涉及多个节点,MySQL又是如何实现分布式事务的呢?比如开发一个业务系统,它接受外部的请求,然后访问多个内部其它系统才能执行该请求.执行时我们需要同时更新多个数据库的值(D1,D2,D3).由于系统必须处于一个一致性,也就是这三个数据库的值要么同时更新成功,要么全部不更新.不然会造成子系统有些指令成功了,有些指令尚未执行.导致对结果理解混乱. 那么,MySQL如何实

  • MySQL数据库的事务和索引详解

    目录 一.事务: 事务四大特性: 并发事务带来哪些问题?(隔离所导致的一些问题) 事务隔离级别有哪些? MySQL的默认隔离级别: 二.索引: 索引的作用: 索引的分类: 索引准则: 索引的数据结构: 总结 一.事务: 事务是逻辑上的一组操作,要么都成功,要么都失败! ---------------------------------- 1.SQL执行        A:1000元     -->转账200元        B:200元 2.SQL执行        A:800元       -

  • mysql事务对效率的影响分析总结

    1.数据库事务会降低数据库的性能.为了保证数据的一致性和隔离性,事务需要锁定事务. 2.如果其他事务需要操作这部分数据,必须等待最后一个事务结束(提交,回滚). 实例 create table acct( acct_no varchar(32), acct_name varchar(32), balance decimal(16,2) ); insert into acct values ('0001','Jerry', 1000), ('0002','Tom', 2000); start tr

  • node连接mysql查询事务处理的实现

    目录 进入正题 mysql 增删改查 mysql 事务处理 自己用 mysql 很多次的,然后又是主玩nodejs的.专门写一篇文章来说说nodejs连接mysql数据库.在使用之前,请检查计算机是否具有一下环境! nodejs 执行环境. mysql数据库环境(下载地址). navicat 连接 mysql 数据库的图形化操作软件.(非必要) 进入正题 mysql 增删改查 首先,我们去下载一个叫mysql的依赖包,这个包就是通过 nodejs 代码去连接数据库,从而操作数据库. 创建一个文件

  • Node连接MySQL并封装其增删改查的实现代码

    目录 Node连接Mysql 安装Mysql模块 连接Mysql 常用的SQL语句 Node操作Mysql 封装 结束 Node连接Mysql 说到node,可能大家会想到MOngoDB作为数据库,这里将会介绍node与mysql的连接,并分享了封装好的实例代码,在项目开发中可直接使用. 安装Mysql模块 npm install mysql 连接Mysql const mysql = require('mysql'); let connection = mysql.createConnecti

  • Vue项目通过node连接MySQL数据库并实现增删改查操作的过程详解

    目录 Vue项目通过node连接MySQL数据库 1.创建Vue项目 2.下载安装需要的插件 3.在项目中创建server文件夹,用于搭建本地服务器 4.Vue项目访问接口获取数据 数据表的增删改查操作 1.服务器配置 2.前端配置 页面样式 总结 Vue项目通过node连接MySQL数据库 1.创建Vue项目 vue create 项目名 Vue项目创建的详细步骤,有需要的可移步这里 2.下载安装需要的插件 下载express npm install express 下载cors,用于处理接口

  • node连接MySQL数据库的3种方式总结

    目录 1.使用mysql包的提供的接口进行连接 2.建立数据库连接池 总结 以下我们将说明node连接数据库的三种方式,并进行利弊说明,以挑选出最适合项目的连接方式. 1.使用mysql包的提供的接口进行连接 例如: connection.query('SELECT * FROM users WHERE id = ?', ['123'], function(err, rows) { if (err) { // error } else { for (let row in rows) { proc

  • node连接mysql数据库遇到的问题和解决方案

    今天安装了新版的MySQL(8.0.21),用node框架连接数据库的时候报了个错: Client does not support authentication protocol requested by server; consider upgrading MySQL client 原因在于MySQL8.0换了加密插件,而数据库管理客户端还是原来旧版本的加密方式,主要在于安装MySQL8.0过程中的Authentication Method这一配置过程,有了不同的加密方式,所以如果选择强加密

  • 初步使用Node连接Mysql数据库

    使用Node做Web页面开发,基本上是连接非关系型数据库mongodb,而这里我还是先尝试连接了一下mysql数据库,因为相对于mysql来说mongodb过于生疏,想着快速出来页面,所以选择相对熟悉一些的mysql. 1. 安装mysql 下载MySQL :MySQL Downloads,并进行安装.安装完,会引导你对数据库进行配置,设置root密码以及创建普通用户以及密码. 2. 安装Node-mysql 通过npm安装mysql的软件包,通过它方便快速调用函数连接mysql数据库.进入项目

  • Node连接mysql数据库方法介绍

    使用Node做Web开发,基本上都是使用NoSQL数据库,最频繁的就是使用MongoDB了,自己做了一些简单的Web开发,为了降低学习门槛,一直使用MySQL来做数据库.这里简单介绍一下连接MySQL数据库的方式,希望能帮助到其他人. npm install --save mysql 使用上述命令安装完MySQL的模块后,就可以直接使用了,官网的DOCS里一个简单的例子如下就可以入门了. var mysql = require('mysql'); var connection = mysql.c

  • PHP连接MySQL查询结果中文显示乱码解决方法

    我们首先假设数据库中采用的编码为UTF-8这时我们在PHP页面中应当首先添加 复制代码 代码如下: <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 此处charset的值utf-8必须与文件保存时的编码类型一样 之后在数据库查询前添加 复制代码 代码如下: mysql_query("set names 'utf8'"); 该行语句的编码值也应当

  • Node.js实现连接mysql数据库功能示例

    本文实例讲述了Node.js实现连接mysql数据库功能.分享给大家供大家参考,具体如下: Node.js连接数据库前,需要安装相应的包,如果安装sql server 需要先装包node-sqlserver.我们以mysql为案例来说明node.js查询mysql数据. 1.安装 node-mysql npm install node-mysql 2.通过express框架实现数据库连接 var express = require('express'); var mysql = require(

  • JDBC连接MySql数据库步骤 以及查询、插入、删除、更新等

    主要内容: JDBC连接数据库步骤. 一个简单详细的查询数据的例子. 封装连接数据库,释放数据库连接方法. 实现查询,插入,删除,更新等十一个处理数据库信息的功能.(包括事务处理,批量更新等) 把十一个功能都放在一起. 安装下载的数据库驱动程序jar包,不同的数据库需要不同的驱动程序(这本该是第一步,但是由于属于安装类,所以我们放在最后) 一.JDBC连接数据库(编辑)步骤(主要有六个步骤) 1.注册驱动: Class.forName("com.mysql.jdbc.Driver");

随机推荐