【问题标题】:How to rollback when error occurred in the second query execution| NodeJS第二次查询执行出错时如何回滚|节点JS
【发布时间】:2020-02-13 23:13:15
【问题描述】:

我曾经在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;

【问题讨论】:

    标签: javascript node.js model-view-controller node-modules rollback


    【解决方案1】:

    这里解释得很好:https://know-thy-code.com/transactions-with-multiple-queries-nodejs-mysql/

    您在第一个查询之前调用sql.beginTransaction() 并将您的查询写入回调中。然后您可以使用sql.rollback() 回滚您的事务或使用sql.commit() 提交更改。

    【讨论】:

      【解决方案2】:

      这取决于您使用的 mysql 引擎,如果您明确未定义事务,则像 innodb 这样的跨国引擎会将每个查询视为单独的事务。

      因此,为了恢复更改,您有两个选择:

      1. 使用更新或删除查询还原更改,这是错误的方法。
      2. 使用 connection.beginTransaction() 显式定义事务并相应地提交或回滚。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-14
        • 1970-01-01
        • 1970-01-01
        • 2018-07-22
        • 1970-01-01
        相关资源
        最近更新 更多