Node-Mysql事务回滚不起作用

时间:2017-02-27 13:01:40

标签: mysql node.js transactions node-mysql

js以及mysql。我在交易方面遇到了麻烦。

在下面的函数中,我完全按照他们在这里所说的那样https://github.com/mysqljs/mysql#transactions。但它不起作用:|

function insertMemoTransaction(){
  pool.getConnection(function(error, connection){
    if(error){
      alert("Somthing is wrong with your connection");
    }
    connection.beginTransaction(function(error){
      if(error) { throw error; }
      var idfield = scope.find('input[name="Party_Id"]');
      var Party_Id;
      if(idfield.val() == '-1'){
        var newParty = {
          // An object
        };
        connection.query("INSERT INTO ?? SET ?",['Party', newParty],function(error, result, fields){
          if(error){
            return connection.rollback(function(){
              throw error;
            });
          }
          else{
            Party_Id = result.insertId;
            var infoObj = {
              // an Object
            }


            connection.query('INSERT INTO ?? SET ?', ['Memo_Info', infoObj], function(error, result, fields){
              if(error){
                return connection.rollback(function(){
                  throw error;
                });
              }
            });
          }
        });
      }
      else{
        Party_Id = idfield.val();
        var infoObj = {
          // an Object
        }

        connection.query('INSERT INTO ?? SET ?', ['Memo_Info', infoObj], function(error, result, fields){
          if(error){
            return connection.rollback(function(){
              throw error;
            });
          }
        });
      }
      connection.commit(function(error) {
        if (error) { 
          return connection.rollback(function() {
            throw error;
          });
        }
        console.log('Transaction Complete.');
        connection.release();
      });
    });
  });
}

我写了这段代码来在 node-mysql 中进行交易,但是,如果,

 connection.query('INSERT INTO ?? SET ?', ['Memo_Info', infoObj], function(error, result, fields)

此查询不会以某种方式运行,影响

connection.query("INSERT INTO ?? SET ?",['Party', newParty],function(error, result, fields)

这个没有回滚。

[我已设置autocommit = 0]

1 个答案:

答案 0 :(得分:0)

Gotcha#1

检查表使用的引擎:

show table status;

如果您所讨论的表设置为MyISAM,则说明存在问题。 MyISAM不支持事务,因此无法回滚。您可以更改表以使用InnoDB作为解决问题的引擎:

ALTER TABLE table_name ENGINE = InnoDB;

或在创建表时进行设置:

CREATE TABLE table_name (
...
) ENGINE = InnoDB;


Gotcha#2

如果您使用池化连接,请确保回滚查询使用相同的连接。

尽管在开发和测试过程中似乎似乎不能保证调用pool.query()使用相同的连接。

请参阅pool.getConnection()的文档以使其正常工作。