首页 > 数据库 >MySQL Node.js mysql 事务

MySQL Node.js mysql 事务

时间:2023-09-14 14:44:24浏览次数:34  
标签:Node function 事务 err mysql js connection MySQL

MySQL Node.js mysql 事务

在MySQL数据库中,事务(transaction)是一组原子性操作,要么全部执行成功,要么全部回滚回去。在多用户并发环境中,事务可以保护数据的一致性和完整性。MySQL提供了ACID属性,并且支持事务。Node.js中,可以通过使用mysql模块的连接来实现事务。

什么是事务

在MySQL数据库中,事务是一组原子性操作。它有四个属性:

  • 原子性(Atomicity):如果一个事务的所有步骤都成功完成,则认为事务成功完成。否则,该事务将被回滚到开始事务之前的状态。
  • 一致性(Consistency):在事务完成前后,数据库的状态应该保持一致。例如,如果一个事务需要将帐户A的金额转移到帐户B,则该操作必须在事务的一次提交中完成,否则将导致数据不一致性。
  • 隔离性(Isolation):事务应当在被其他事务影响之前完成。在事务操作完成之前,不应该有其他事务对其执行的数据产生干扰。
  • 持久性(Durability):在事务提交后,更改的数据应该被保存下来。即使系统崩溃也应该保证数据的持久性。

MySQL事务的使用

在MySQL中,事务是通过以下语句开始,包裹一组SQL语句

BEGIN;
SQL Statements;
COMMIT;

如果其中任何一个SQL语句失败,则事务被回滚到初始状态。下面是一个使用Node.js实现MySQL事务的示例:

const mysql = require('mysql');
const connection = mysql.createConnection({
   host: 'localhost',
   user: 'root',
   password: 'password',
   database: 'mydb'
});

connection.connect(function(err) {
   if (err) throw err;
   console.log('Connected!');

   connection.beginTransaction(function(err) {
      if (err) throw err;

      let sql1 = "UPDATE customers SET address = 'Highway 1' WHERE address = 'Park Lane 38'";
      connection.query(sql1, function(err, result) {
         if (err) {
            connection.rollback(function() {
               throw err;
            });
         }

         let sql2 = "DELETE FROM suppliers WHERE supplier_id = 1";
         connection.query(sql2, function(err, result) {
            if (err) {
               connection.rollback(function() {
                  throw err;
               });
            }  

            connection.commit(function(err) {
               if (err) {
                  connection.rollback(function() {
                     throw err;
                  });
               }
               console.log('Transaction Completed Successfully!');
               connection.end();
            });
         });
      });
   });
});

上面示例中,我们先使用beginTransaction()方法开启事务。在那之后,我们执行一些SQL语句。如果有任何错误发生,那么我们将会回滚事务。否则我们提交事务,并在之后断开连接。

使用事务的场景

事务应该在以下场景中使用:

  • 转移资金的时候,如果有一个帐户被扣除,但是收到的帐户并没有增加数额,那么整个事务应该回滚。
  • 在向多个表中插入数据时,如果一个表中的更新失败,则应该回滚所有表中的数据。
  • 当一个错误的行数据需要被更改时,可以使用事务进行更改。

在使用事务时,需要注意以下事项:

  • 在MySQL中,只有在启用事务日志时,才能执行事务。如果事务日志关闭,则不会执行任何事务。
  • 仅在InnoDB表类型上提供事务支持。
  • 事务应该避免长时间持有数据库锁。

总结

MySQL支持事务,并且通过Node.js中的mysql模块,可以很方便地在Node.js中使用事务。事务可以在多用户并发环境中保护数据的一致性和完整性,并避免数据不一致的情况发生。事务必须具有ACID属性,即原子性、一致性、隔离性和持久性。在使用事务时,需要注意启用事务日志、避免长时间持有数据库锁等问题。在实际开发中,需要合理地使用事务,以确保数据的安全性和完整性。

标签:Node,function,事务,err,mysql,js,connection,MySQL
From: https://www.cnblogs.com/yuanjiejie/p/17702443.html

相关文章

  • Mysql命令整理
    整理一下,时常用到,不定期更新:(1)连接数据库:/local/mysql/bin./mysql--port=3301-uroot-p123456--protocol=tcp(2)创建数据库:createdatabasedbname;(3)切换数据库:use dbname ;(4)赋予权限:GRANTALLONdbname.*TO......
  • 公司某产品MySql分布式架构总结
    这个是目前公司某产品Server端MySql分布式架构总结(内容总结自wiki),该产品同时使用了Mysql和MongoDB。本篇Blog只做Mysql分布式架构的介绍。----------------------------------------------------一、共4台Linux服务器A\B\C\DAmasterwithslaveBC......
  • MySQL性能优化之 - 单表查询+代码层拼接 VS 表连接查询
    单表查询+代码端拼接的优势记得当初单位派我去阿里交流学习时,人家就说,在阿里,95%以上的查询都是单表查询,虽然我们都知道单表查询更加符合MySql底层的算法逻辑,但是单表查询+代码端拼接的优势究竟是什么,它为什么互联网企业都会使用单表查询呢?归纳而言大体分以下几点:1.激活代码端和......
  • Mysql主从复制原理
     本文总结自网上关于Mysql复制原理的一些文章。----------------------------------------------------------1、Mysql复制是一个异步的复制,从masterinstance到slaveinstance,实现整个复制操作主要使用3个进程完成。其中2个进程是Slave的Sql进程和IO进......
  • MYSQL单列索引和组合索引的对比分析
    单列索引:即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引:即一个索包含多个列。怎么选择:如果查询where条件只有一个,完全可以用单列索引,这样的查询速度较快,索引也比较瘦身。如果业务场景是需要经常查询多个组合列,不要试图分别基于单个列建立多个单......
  • MySQL篇:第三章_详解DQL语言
    DQL语言的学习基础查询一、语法:SELECT要查询的东西【FROM表名】;类似于Java中:System.out.println(要打印的东西);特点:①通过select查询完的结果,是一个虚拟的表格,不是真实存在②要查询的东西可以是常量值、可以是表达式、可以是字段、可以是函数二、特点1、查询......
  • mysql事务回滚
    前几天发现程序有个Bug:使用JPA已经设置了回滚,但抛出异常后,提交的事务并没有回滚。刚开始以为是JPA使用问题,debug了近2个多小时竟然找不到原因。后来上网查了一下,才发现不是程序问题(坑爹啊,看来自己对mysql还是不熟),是数据库表问题(JPA自动建表)。原因如下:mysql建表时如果指定ENG......
  • js tools
    /*日期时间格式化@date日期||时间@typedayjs的format类型*/exportconstformat=(date,type='YYYY-MM-DD')=>{if(!date)return''constu=navigator.userAgent;constisIOS=!!u.match(/(i[^;]+;(U;)?CPU.+MacOSX/);if(isIOS&&am......
  • MySQL篇:bug2_ Navicate无法添加或更新子行-外键约束失败
    问题产生原因Mysql中如果表和表之间建立的外键约束,则无法删除表及修改表结构。解决办法解决方法是在Mysql中取消外键约束:SETFOREIGN_KEY_CHECKS=0;再添加值,然后再设置外键约束:SETFOREIGN_KEY_CHECKS=1;查看当前FOREIGN_KEY_CHECKS的值可用如下命令:SELECT@@FOR......
  • N天爆肝数据库——MySQL(2)
    (N天爆肝数据库——MySQL(2))链接:link这是csdn专栏链接,大家可以看一看,提提意见本篇文章,主要对DMLDQL进行知识总结和学习。期待和大家一起学习进步。DML-介绍DML(数据库操作语言),用来对数据库中表的数据记录进行增删改操作。添加数据(INSERT)修改数据(UPDATE)删除数据(DELET......