остальные запросы запускают событие после отката в транзакции - PullRequest
0 голосов
/ 24 января 2019

У меня есть функция для совершения транзакции, как показано ниже

utils.sqlTransaction = function (event, callback) {

    let connection = mysql.createConnection(dbConfig);
    let queryItemPosition = 0;
    let queriesData = event;
    let resultData = [];
    function queryItem() {
        if (queryItemPosition > (queriesData.length - 1)) {
            connection.commit(function (err) {
                if (err) {
                    connection.rollback(function () {
                        return callback("Error in processing request commit");
                    });
                }
                connection.end();
                return callback(null, resultData);
            });
        } else {
            let queryData = queriesData[queryItemPosition] ? queriesData[queryItemPosition].queryData : {};
            let parsedQuery = utils.getQuery(queriesData[queryItemPosition].query, queryData);

            if (parsedQuery == false) {
                connection.rollback(function () {
                    return callback("\nQuery :-> " + event.query + " <-:  not Found!!");
                });
            }

            connection.query(parsedQuery, function (err, result) {
                if (err) {
                    connection.rollback(function () {
                        return callback(err);
                    });
                }
                resultData.push(result);
                queryItemPosition++;
                queryItem();
            })

        }
    }

    connection.beginTransaction(function (err) {
        if (err) { return callback(err); }
        queryItem();
    });
}

Я передаю ей данные как

[{
        "query": "some_query",
        "queryData": {}
}, 
{
        "query": "someother_query",
        "queryData": {}
}]

Так что этот массив запросов он обрабатывает.Но в случае ошибки, даже если я позвоню .rollback, он выполняет оставшиеся запросы.Пожалуйста, помогите мне решить эту проблему.

ПРИМЕЧАНИЕ: я использую mysql пакет

Спасибо ...

1 Ответ

0 голосов
/ 24 января 2019

Это потому, что откат происходит как асинхронная функция, но ваш код не ждет этого. Измените свой код на что-то вроде:

if (err) {
     connection.rollback(function () {
           return callback("Error in processing request commit");
     });
}
else {
    connection.end();
    return callback(null, resultData);
}

Аналогично для всех других частей вашего кода, например:

 if (parsedQuery == false) {
       connection.rollback(function () {
           return callback("\nQuery :-> " + event.query + " <-:  not Found!!");
       });
 }
 else {
      // continue rest of code here
 }

Таким образом, успешный поток вашего кода не будет выполняться в случае ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...