NodeJS - MySQL Транзакции не работают должным образом - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь применить Trasnactions (beginTransaction, rollback и commit. Однако, если запрос на добавление счета-фактуры (первый запрос) выполнен успешно, я хочу обновить сумму поставщика (Второй запрос). Я намеревался напишите неправильный синтаксис во втором запросе, изменив UPDATE на UPDATEEE. Я предполагал, что это должно rollback. Я получил сообщение об ошибке синтаксиса запроса, но счет был добавлен (первый запрос успешно выполнен).

Что такое что я делаю не так?

Invoice.addNewInvoice = function (invoice_data,result){

    sql.beginTransaction(function(err){
        if (err) { throw err; }

        sql.query('INSERT INTO invoice SET ?',invoice_data, function(err,res){
            if(err){
                sql.rollback(function() {
                    throw err;
                });
            }else{
                sql.query('UPDATEEEEE supplier SET supplier_amount = supplier_amount + ' + invoice_data.invoice_amount + ' WHERE supplier_id = ' + invoice_data.supplier_id, function(err,res){
                    if(err){
                        sql.rollback(function() {
                            throw err;
                        });
                    }
                })
                sql.commit(function(err) {
                    if (err) { 
                        sql.rollback(function() {
                            throw err;
                        });
                    }else{

                        result(null,res);
                    }
                });
            }

        });
    });
}

1 Ответ

0 голосов
/ 06 мая 2020

Проблема в том, что я установил commit для выполнения, даже если второй запрос не выполнен. он должен быть установлен на else, как показано ниже:

Invoice.addNewInvoice = function (invoice_data,result){

    sql.beginTransaction(function(err){
        if (err) { throw err; }

        sql.query('INSERT INTO invoice SET ?',invoice_data, function(err,res){
            if(err){
                sql.rollback(function() {
                    throw err;
                });
            }else{
                sql.query('UPDATEEEEE supplier SET supplier_amount = supplier_amount + ' + invoice_data.invoice_amount + ' WHERE supplier_id = ' + invoice_data.supplier_id, function(err,res){
                    if(err){
                        sql.rollback(function() {
                            throw err;
                        });
                    }else{
                        sql.commit(function(err) {
                            if (err) { 
                                sql.rollback(function() {
                                    throw err;
                                });
                            }else{

                                result(null,res);
                            }
                        });
                    }
                })

            }

        });
    });
}

Таким образом, откат выполняется, если второй запрос не выполнен.

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