Как выполнить откат при возникновении ошибки при выполнении второго запроса | NodeJS - PullRequest
0 голосов
/ 14 февраля 2020

Я использовал откат в PHP, я хочу реализовать ту же концепцию в NodeJS. Я вызываю функцию, которая вставляет данные в database, и в случае успеха я вызываю другую функцию из другой Model, чтобы вставить данные в другую table.

Мой код

StoreReport

'use strict';

var sql = require('./db.js');

// IMPORT ANOTHER MODEL
var CashDetailModel = require('./cashDetailModel.js');

var StoreReport =function(storeReport){
    this.store_id=storeReport.store_id;
    this.cash_expense=storeReport.cash_expense_amount;

}

StoreReport.addNewStoreReport = function (report_details,request,result){

    sql.query('INSERT INTO store_report SET ?',report_details, function(err,res){
        if(err){
            result(err,null);
        }else{
            var new_cash_detail = new CashDetailModel(report_details);
            new_cash_detail.store_report_id=res.insertId;
            CashDetailModel.addCashDetail(new_cash_detail,function(err,CashDetailModel){
                if(err){

                  // I NEED TO ROLLBACK IF ERROR OCCURED IN THIS PHASE
                    res.send(err);
                }else{
                    result(null,res.inserted);
                }
            })
        }
    })
}

module.exports = StoreReport;

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Это зависит от того, какой механизм mysql вы используете, транснациональные механизмы, такие как innodb, рассматривают каждый запрос как отдельную транзакцию, если вы явно не определяете транзакцию.

Таким образом, чтобы отменить изменение, у вас есть два варианта:

  1. Отменить изменения с помощью запроса на обновление или удаление, что неверно.
  2. Явно определите транзакцию используя connection.beginTransaction () и зафиксировать или откатить соответственно.
1 голос
/ 14 февраля 2020

Здесь все хорошо объяснено: https://know-thy-code.com/transactions-with-multiple-queries-nodejs-mysql/.

Вы звоните sql.beginTransaction() перед первым запросом и пишете свои запросы в обратном вызове для этого. Затем вы можете откатить транзакцию с помощью sql.rollback() или зафиксировать изменения с помощью sql.commit().

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