Node中如何实现事务(临时版)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 群里有学生提出要一个事务的例子。。比较急 我就先把试验放出来概念和其他的后面再补充

事务是什么


简单的说A表和B表操作属于同一个事务,A表和B表操作需要同时成功同时失败。


Node实现


创建两个表accountA 、accountB


CREATE TABLE IF NOT EXISTS accountB (
id INT NOT NULL AUTO_INCREMENT,
amount INT NULL,
PRIMARY KEY (id)
);
CREATE TABLE IF NOT EXISTS accountA (
id INT NOT NULL AUTO_INCREMENT,
amount INT NULL,
PRIMARY KEY (id)
);


代码实现


我们对两个表都插入一条数据,中间通过执行一个错误的SQL故意制造一个异常。


module.exports = async (pool,isAutoCommit) => {
  const conn = await pool.getConnection()
  // 开启事务
  isAutoCommit && await conn.beginTransaction()
  try {
    // 操作表A
    let res = await conn.query(`
      INSERT INTO accountA (amount) VALUES (1)
    `)
    // 人为制造异常
    res = await conn.query(`
      KKB 
   `)
    // 操作表B
    res = await conn.query(`
      INSERT INTO accountB (amount) VALUES (1)
    `)
    // console.log('INSERT ACCOUNT B ', res)
    isAutoCommit && await conn.commit()
  } catch (error) {
    // console.log('发生error...', error)
    await conn.rollback()
  }
  conn.release()
}


测试用例


这里面分成两个用例分别测试有事务和没有事务的情况


  • 有事务的时候 出错会回滚 两个表都不会插入数据


  • 没有事务的时候 不会回滚 出错前的表插入还将生效


const callback = require('../index')
// get the client
const mysql = require('mysql2/promise');
// 连接配置
const cfg = {
    host: "localhost",
    user: "root",
    password: "example", // 修改为你的密码
    database: "test", // 请确保数据库存在
    connectionLimit: 5,
    // debug:true
}
test('Test 使用事务', async (done) => {
    const pool = await mysql.createPool(cfg)
    // 准备环境
    // 所有表数据清空
    const conn = await pool.getConnection()
    // 清理表数据
    await conn.query(`
      TRUNCATE TABLE accountA 
    `)
    await conn.query(`
      TRUNCATE TABLE accountB
    `)
    await callback(pool, true)
    // 查询结果
    const [countA] = await conn.execute(`SELECT count(*) as count FROM accountA`)
    const [countB] = await conn.execute(`SELECT count(*) as count FROM accountB`)
    console.log('AmountA', countA[0].count)
    console.log('AmountB', countB[0].count)
    done()
    // setTimeout(done,4000)
})
test('Test 未使用事务', async (done) => {
    const pool = await mysql.createPool(cfg)
    // 准备环境
    // 所有表数据清空
    const conn = await pool.getConnection()
    // 清理表数据
    await conn.query(`
      TRUNCATE TABLE accountA 
    `)
    await conn.query(`
      TRUNCATE TABLE accountB
    `)
    await callback(pool, false)
    // 查询结果
    const [countA] = await conn.execute(`SELECT count(*) as count FROM accountA`)
    const [countB] = await conn.execute(`SELECT count(*) as count FROM accountB`)
    console.log('AmountA', countA[0].count)
    console.log('AmountB', countB[0].count)
    done()
    // setTimeout(done,4000)
})


测试结果



代码放在github.com/su37josephx…


大家可以试试 保持关注 后面我会完善



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
Web App开发 监控 JavaScript
【Node系列】创建第一个服务器应用
Node.js是一个基于Chrome V8引擎的JavaScript运行环境,可以用于构建高性能的网络应用程序。它采用事件驱动、非阻塞I/O模型,使得程序可以以高效地方式处理并发请求。
52 4
|
2月前
|
存储 缓存 NoSQL
node中session持久化问题解决
本文介绍了如何解决Node.js中session无法持久化的问题,通过使用Redis数据库来实现session的持久化存储。
24 0
|
11月前
【Node】—接收参数 插入数据 实现注册功能
【Node】—接收参数 插入数据 实现注册功能
|
NoSQL JavaScript MongoDB
在Node中如何操作MongoDB数据库(一)
在Node中如何操作MongoDB数据库(一)
139 0
|
NoSQL JavaScript MongoDB
在Node中如何操作MongoDB数据库(二)
在Node中如何操作MongoDB数据库(二)
127 0
|
SQL JavaScript 关系型数据库
如何使用Node操作MySQL数据库
如何使用Node操作MySQL数据库
240 0
|
Kubernetes 小程序 容器
k8s一键扩容node节点脚本
k8s一键扩容node节点脚本
node笔记记录8同步和异步4
node笔记记录8同步和异步4
50 0
node笔记记录8同步和异步4
node笔记记录6同步和异步2
node笔记记录6同步和异步2
51 0
node笔记记录6同步和异步2
node笔记记录5同步和异步1
node笔记记录5同步和异步1
64 0
node笔记记录5同步和异步1