【问题标题】:Queries are not executed after transaction is rolled back事务回滚后不执行查询
【发布时间】:2012-07-15 20:37:45
【问题描述】:

我想在 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,这会导致索引重复错误。事务被回滚,但问题是事务之外的第二个插入没有执行。没有记录错误,而且 - 对我来说很奇怪 - 当我在第二次插入之后选择整个表时,结果中有新行。但在另一个连接中它消失了。所以看起来在连接结束时新创建的行被删除了。提交事务时不会出现问题。

【问题讨论】:

    标签: mysql node.js transactions node-mysql


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-15
      • 2015-06-25
      • 2017-04-10
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多