【问题标题】:NodeJS - MySQL Transactions not working as expectedNodeJS - MySQL 事务未按预期工作
【发布时间】:2020-05-04 13:26:38
【问题描述】:

我正在尝试应用 Trasnactions(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);
                    }
                });
            }

        });
    });
}

【问题讨论】:

  • 您是否在与 MySQL 的连接中关闭了自动提交功能?
  • @DaveD 我尝试set autocommit = 0' it shows that it turned off, i even ensure it by SELECT @@autocommit` 结果是0 但这并没有改变任何东西。你有什么想法吗?

标签: javascript node.js transactions rollback


【解决方案1】:

问题是我将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);
                            }
                        });
                    }
                })

            }

        });
    });
}

这样,如果第二个查询失败,它就会回滚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    相关资源
    最近更新 更多