Nodejs MYSQL ASYNC 整合事务支持

Nodejs MYSQL ASYNC 整合事务支持

因为项目中要用到事务,而且还要保证sql语句的顺序执行,所以有了下面的代码。 也是用了好多种方法,最后决定有下面的,希望能满足你的需求。

// 加载mysql var mysql = require(’./mysqlConn’); // 加载mysql-queues 支持事务 var queues = require(‘mysql-queues’); // 加载async 支持顺序执行 var async = require(‘async’);

var db_tran = function(){ // 获取事务 queues(mysql); var trans = mysql.startTransaction();

async.series([
    function(insert_cb) { 
    	var insert_sql = "INSERT INTO `shop` (`id`, `name`, `address`, `tel`, `fax`, `mail`, `shop_kbn`, `modified_date`, `modified_id`) VALUES ('18', '1212', '1212', '12', '12', '12', '12', '2013-05-28 16:10:15', '0')";
    	// 执行第一条sql语句 如果出错 直接进入最后的 错误方法 回滚事务
    	trans.query(insert_sql, function(err, info) {
    		insert_cb(err, info);
    	})
},
function(update_cb_1) { 
	var update_sql_1 = "UPDATE `shop` SET `address`='管理会社  1' WHERE `id`='17'";
	
	// 执行第二条sql语句 如果出错 直接进入最后的 错误方法 回滚事务
	trans.query(update_sql_1, function(err, info) {
		update_cb_1(err, info);
	})
},
function(update_cb_2) {
	var update_sql_2 = "UPDATE `shop` SET `address`='管理会社  2' WHERE `id`='16'";
	// 执行第三条sql语句 如果出错 直接进入最后的 错误方法 回滚事务
	trans.query(update_sql_2, function(err, info) {
		update_cb_2(err, info);
	})
	
}

], function(err, results) { if (err) { console.log(“rollback”); // 出错的场合 回滚 trans.rollback(); } else { // 没有错误的场合 提交事务 trans.commit(); }

}); // 执行这个事务 trans.execute();

}


3 回复

Nodejs MYSQL ASYNC 整合事务支持

在项目开发过程中,有时需要确保一系列数据库操作按顺序执行且具有原子性。这可以通过使用事务来实现。以下是一个示例代码,展示了如何在 Node.js 中使用 MySQL、mysql-queuesasync 库来整合事务支持。

依赖库

首先,确保你已经安装了所需的库:

npm install mysql mysql-queues async

示例代码

// 加载mysql
var mysql = require('./mysqlConn');
// 加载mysql-queues 支持事务
var queues = require('mysql-queues');
// 加载async 支持顺序执行
var async = require('async');

var db_tran = function() {
    // 获取事务
    var trans = queues(mysql).startTransaction();

    async.series([
        function(insert_cb) { 
            var insert_sql = "INSERT INTO `shop` (`id`, `name`, `address`, `tel`, `fax`, `mail`, `shop_kbn`, `modified_date`, `modified_id`) VALUES ('18', '1212', '1212', '12', '12', '12', '12', '2013-05-28 16:10:15', '0')";
            // 执行第一条sql语句 如果出错 直接进入最后的 错误方法 回滚事务
            trans.query(insert_sql, function(err, info) {
                if (err) return insert_cb(err);
                insert_cb(null, info);
            });
        },
        function(update_cb_1) { 
            var update_sql_1 = "UPDATE `shop` SET `address`='管理会社  1' WHERE `id`='17'";
            // 执行第二条sql语句 如果出错 直接进入最后的 错误方法 回滚事务
            trans.query(update_sql_1, function(err, info) {
                if (err) return update_cb_1(err);
                update_cb_1(null, info);
            });
        },
        function(update_cb_2) {
            var update_sql_2 = "UPDATE `shop` SET `address`='管理会社  2' WHERE `id`='16'";
            // 执行第三条sql语句 如果出错 直接进入最后的 错误方法 回滚事务
            trans.query(update_sql_2, function(err, info) {
                if (err) return update_cb_2(err);
                update_cb_2(null, info);
            });
        }
    ], function(err, results) {
        if (err) {
            console.log("rollback");
            // 出错的场合 回滚
            trans.rollback();
        } else {
            // 没有错误的场合 提交事务
            trans.commit();
        }
    });

    // 执行这个事务
    trans.execute();
};

// 调用事务函数
db_tran();

解释

  1. 加载库:

    • mysql: 用于连接和操作 MySQL 数据库。
    • mysql-queues: 提供事务支持。
    • async: 用于顺序执行异步任务。
  2. 事务初始化:

    • 使用 queues(mysql) 初始化事务,并调用 startTransaction() 方法开始一个新事务。
  3. 顺序执行:

    • 使用 async.series 方法来确保每个 SQL 语句按顺序执行。
    • 每个任务函数接收一个回调函数(如 insert_cb),用于处理结果或错误。
  4. 错误处理:

    • 如果某个 SQL 语句执行出错,则直接进入错误处理函数,事务将被回滚。
    • 如果所有 SQL 语句都成功执行,则提交事务。
  5. 执行事务:

    • 最后调用 trans.execute() 来执行事务。

通过这种方式,你可以确保一系列数据库操作在一个事务中按顺序执行,并且如果其中任何一个步骤失败,整个事务将被回滚。


如果想用上一个sql 执行的结果数据,是不是要在async.series([ 之前创建好变量接收,然后在下面用呀? 还有其他办法吗?

为了整合Node.js中的MySQL事务支持,并确保SQL语句按顺序执行,我们可以使用mysql-queues库来管理事务队列,并使用async库来确保异步操作按顺序执行。下面是具体的实现示例:

示例代码

const mysql = require('./mysqlConn'); // 引入MySQL连接模块
const queues = require('mysql-queues'); // 引入mysql-queues模块
const async = require('async'); // 引入async模块

function db_tran() {
    const trans = queues(mysql).startTransaction(); // 开始一个事务

    async.series([
        function(callback) { 
            const insert_sql = "INSERT INTO `shop` (`id`, `name`, `address`, `tel`, `fax`, `mail`, `shop_kbn`, `modified_date`, `modified_id`) VALUES ('18', '1212', '1212', '12', '12', '12', '12', '2013-05-28 16:10:15', '0')";
            trans.query(insert_sql, callback); // 执行插入语句
        },
        function(callback) { 
            const update_sql_1 = "UPDATE `shop` SET `address`='管理会社  1' WHERE `id`='17'";
            trans.query(update_sql_1, callback); // 执行第一个更新语句
        },
        function(callback) { 
            const update_sql_2 = "UPDATE `shop` SET `address`='管理会社  2' WHERE `id`='16'";
            trans.query(update_sql_2, callback); // 执行第二个更新语句
        }
    ], function(err, results) {
        if (err) {
            console.log("Rollback due to error.");
            trans.rollback(); // 如果有错误,则回滚事务
        } else {
            console.log("Committing transaction.");
            trans.commit(); // 没有错误,则提交事务
        }

        trans.execute(); // 执行事务
    });
}

db_tran(); // 调用函数

解释

  1. 引入必要的模块mysql用于数据库连接,mysql-queues用于管理事务队列,async用于控制异步操作的顺序。
  2. 开始事务:通过queues(mysql).startTransaction()获取一个事务对象。
  3. 异步操作序列:使用async.series确保SQL语句按顺序执行。每个操作都包含一个回调函数,用于处理查询结果或错误。
  4. 事务控制:在所有操作完成后,根据是否有错误来决定是回滚还是提交事务。
  5. 执行事务:调用trans.execute()来实际执行事务。

这样可以确保所有的SQL操作在一个事务中执行,并且按照指定的顺序进行。如果任何一个操作失败,整个事务将被回滚,以保持数据的一致性。

回到顶部