NodeJS - connection.rollback()如何与async.parallel一起使用

时间:2017-04-06 08:40:54

标签: node.js

我对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收到错误。
  • 对不起,我不太了解。感谢您的阅读

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()之前,不会将任何命令提交到数据库。您可能想要了解的一件事是commitrollback方法是否是异步的,即它们希望您将回调传递给它们。如果是这样,您的代码将在提交或回滚事务之前运行res.json