NodeJS-MySQL事务无法按预期工作

问题描述 投票:0回答:1

我正在尝试应用交易(beginTransactionrollbackcommit。但是,如果成功执行添加发票的查询(第一查询),我想更新供应商金额(第二查询)。我打算写通过将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);
                    }
                });
            }

        });
    });
}
javascript node.js transactions rollback
1个回答
0
投票
问题是即使第二次查询失败,我也将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); } }); } }) } }); }); }

以这种方式回滚,因为第二个查询失败。    
© www.soinside.com 2019 - 2024. All rights reserved.