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();
}
Nodejs MYSQL ASYNC 整合事务支持
在项目开发过程中,有时需要确保一系列数据库操作按顺序执行且具有原子性。这可以通过使用事务来实现。以下是一个示例代码,展示了如何在 Node.js 中使用 MySQL、mysql-queues
和 async
库来整合事务支持。
依赖库
首先,确保你已经安装了所需的库:
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();
解释
-
加载库:
mysql
: 用于连接和操作 MySQL 数据库。mysql-queues
: 提供事务支持。async
: 用于顺序执行异步任务。
-
事务初始化:
- 使用
queues(mysql)
初始化事务,并调用startTransaction()
方法开始一个新事务。
- 使用
-
顺序执行:
- 使用
async.series
方法来确保每个 SQL 语句按顺序执行。 - 每个任务函数接收一个回调函数(如
insert_cb
),用于处理结果或错误。
- 使用
-
错误处理:
- 如果某个 SQL 语句执行出错,则直接进入错误处理函数,事务将被回滚。
- 如果所有 SQL 语句都成功执行,则提交事务。
-
执行事务:
- 最后调用
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(); // 调用函数
解释
- 引入必要的模块:
mysql
用于数据库连接,mysql-queues
用于管理事务队列,async
用于控制异步操作的顺序。 - 开始事务:通过
queues(mysql).startTransaction()
获取一个事务对象。 - 异步操作序列:使用
async.series
确保SQL语句按顺序执行。每个操作都包含一个回调函数,用于处理查询结果或错误。 - 事务控制:在所有操作完成后,根据是否有错误来决定是回滚还是提交事务。
- 执行事务:调用
trans.execute()
来实际执行事务。
这样可以确保所有的SQL操作在一个事务中执行,并且按照指定的顺序进行。如果任何一个操作失败,整个事务将被回滚,以保持数据的一致性。