我想在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,这会导致索引重复错误。事务被回滚,但问题是不执行事务外部的第二个插入。没有记录错误,并且 - 对我来说很奇怪 - 当我在第二次插入之后选择整个表时,结果中有新行。但在另一个连接中,它消失了。所以看起来在连接结束时新创建的行被删除了。提交事务时不会出现此问题。
答案 0 :(得分:1)
您的第二个INSERT INTO
可以在第一个ROLLBACK
回调中的INSERT INTO
之前执行,因为它在回调之外执行。当发生这种情况时,您的第二个插入也会回滚,因为您正在使用单个连接。将第二个插入内容移动到第一个插入内部序列化内容。