2012-07-16 93 views
0

我想执行node-mysql中的事务(通过执行查询START TRANSACTION,ROLLBACK,COMMIT)。我有这段代码:事务回滚后不执行查询

conn.query("START TRANSACTION"); 
conn.query("INSERT INTO users (id, name, age) VALUES (1, 'Mat', '24')", function(e){ 
    if (e){ 
     conn.query("ROLLBACK", callback); 
    } 
    else{ 
     conn.query("COMMIT", callback); 
    } 
}); 

conn.query("INSERT INTO users (name, age) VALUES ('Mat', '24')", function(e, r){ 
    console.log(e); // null 
    console.log(r); // {fieldCount: 0, affectedRows: 1, insertId: 2, serverStatus: 3, warningCount: 0, message: ''} 
}); 

要测试回滚的情况下,我有意将id设置为1,这会导致索引重复错误。事务回滚,但问题在于事务外部的第二次插入未执行。没有错误记录,并且 - 对我来说很奇怪 - 当我在第二次插入之后选择整个表格时,结果中有新的一行。但在另一个连接中它消失了。所以它看起来像在连接结束时新创建的行被删除。交易提交时不会出现问题。

回答

1

您的第二个INSERT INTO可以在您的ROLLBACK之前执行第一个INSERT INTO回调,因为它在回调之外执行。当发生这种情况时,您的第二次插入也正在回滚,因为您正在使用单个连接。将第二个插入内部的第一个插入到第一个的回调中以序列化事物。