我对nodejs完全陌生。我想问一下您使用此示例代码connection.beginTransaction();
进行错误处理的专业知识。
connection.beginTransaction(function(){
async.parallel([
function(callback){
connection.query('INSERT INTO SUBJECT.PROJECT (Name, Score) VALUES (?,?)',
['Drake', '85']
, function(error){
//if(error)
// connection.rollback();
callback(error);
});
},
function(callback){
connection.query(someUpdateQuery, someValues,
function(error){
//if(error)
// connection.rollback();
callback(error);
});
}
], function(error){
var msg;
if(error) {
connection.rollback();
msg = 'Error! ' + error;
}
else {
connection.commit();
msg = 'Success';
}
res.json(msg);
});
});
connection.rollback()
中的每个connection.query都有if(error)
,我可以删除每个connection.rollback()
connection.query并依赖于最后一个函数来代替处理
connection.rollback()
? - 它会回滚所有(比如说) 10插入查询函数然后第5个1收到错误。答案 0 :(得分:0)
您是对的 - 您可以删除单个查询的回滚语句,并依赖async.parallel
回调中的回滚语句。您的代码看起来像这样:
connection.beginTransaction(function () {
async.parallel([
function (callback) {
connection.query('INSERT INTO SUBJECT.PROJECT (Name, Score) VALUES (?,?)',
['Drake', '85']
, callback);
},
function (callback) {
connection.query(someUpdateQuery, someValues, callback);
}
], function (error) {
var msg;
if (error) {
connection.rollback();
msg = 'Error! ' + error;
}
else {
connection.commit();
msg = 'Success';
}
res.json(msg);
});
});
这是有效的,因为在最终回调中调用connection.commit()
之前,不会将任何命令提交到数据库。您可能想要了解的一件事是commit
和rollback
方法是否是异步的,即它们希望您将回调传递给它们。如果是这样,您的代码将在提交或回滚事务之前运行res.json
。