mysql - Node-Mysql 事务回滚不起作用

标签 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)

这个不会回滚。

[我已设置自动提交 = 0]

最佳答案

问题#1

检查您的表正在使用哪个引擎:

show table status;

如果您的相关表设置为 MyISAM,那么您就发现了问题。 MyISAM不支持事务,因此无法回滚。您可以更改表以使用 InnoDB 作为引擎来解决问题:

ALTER TABLE table_name ENGINE = InnoDB;

或者在创建表时设置它:

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


陷阱#2

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

调用 pool.query() 不保证使用相同的连接,尽管在开发和测试期间可能看起来如此。

请参阅 pool.getConnection() 的文档使其发挥作用。

关于mysql - Node-Mysql 事务回滚不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42486471/

相关文章:

javascript - 输出相同但字符长度不同

javascript - firestore transaction.set(ref, data, {merge : true}) and transaction. update(ref, data) 之间有什么区别?

php - 是否可以使用 php 和 curl 在 mysql 中处理多个连接

android - 表 "Tablename"没有名为 "columnname"的列,但它有一个

javascript - 'sort'方法在chrome环境和node环境有什么区别

node.js - 使用node.js在Heroku中找不到模块 'Parse'

java - 是否有必要对 catch block 中的事务进行回滚?

mysql - 在什么情况下人们想要连接到本地主机以外的主机?

PHPMYADMIN 返回结果,PHP 查询不返回结果

php - "group"mysql结果以获得更好的php性能