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]
答案 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()
的文档以使其正常工作。