【问题标题】:Node MySQL: Transaction with Varying Queries节点 MySQL:具有不同查询的事务
【发布时间】:2016-09-22 04:17:05
【问题描述】:

问题

我正在尝试为我的 node.js 应用程序开发一个简单的框架,它允许我根据上下文和我需要完成的任务来传递各种查询的可变序列以触发。

困难在于,当涉及到插入/更新/删除语句时,就像模块未能提交事务,而数据库仍然不受影响——这对于单个查询和事务中的查询都会发生,这对于交易来说尤其奇怪(我在最后调用 conn.commit() )。

准系统代码

区别:有一个结果解析脚本也可以动态提供,以防需要根据插入的行进行特殊处理。

function runTransaction(queries)
{
    var tranResults = {};
    var tranDef = Promise.defer();
    connection.beginTransaction(function(err){
        if(err instanceof Error)
        {
            tranDef.reject(err);
            connection.rollback();
            return;
        }
        let index = -1;
        function runTransactionQueries()
        {
            if(index >= queries.length)
            {
                connection.commit();
                tranDef.resolve(tranResults);
                return;
            }
            index++;
            let query = queries[index];
            connection.query(query, function(err, result){
                if(err instanceof Error)
                {
                    tranDef.reject(err);
                    connection.rollback();
                    return;
                }
                tranResults[index] = result;
                return runTransactionQueries();
            })
        }
        return runTransactionQueries();
    }
    return tranDef.promise;
}
runTransaction([array,of,validated,query,objects]).then(results => {
    // This is always triggered, and it's always an OkPacket
    // But when I check the database after UPDATE, INSERT, or DELETE, the
    // queries have had no effect.
    console.log(results);
}).catch(e => {
    // This never fires.
    console.log(e);
})

我尝试过的事情

我尝试使用承诺延迟的动态数组来控制事务流,并尝试让它们同步运行。我与数据库的所有连接都很好,并且当我对单个 GET 请求使用相同的连接或连接池时,它可以正常工作。我开始使用事务,因为使用 INSERT、UPDATE 或 DELETE 语句运行 connection.query() 无法成功写入数据库,这让我认为我可能不得不强制提交(尽管相同的查询有效来自 MySQL 工作台)。

在单连接和连接池中都存在同样的问题:查询返回一个 OkPacket,显示行已被更改和插入,但是当我在 MySQL Workbench 中访问数据库时,它们不存在。

我的问题

我在这里遗漏了什么吗?我对 JavaScript 的了解表明这应该可以工作。这是我什至应该尝试的事情吗?是否有任何库或框架可以让在 node.js 中使用 MySQL 变得更简单?我正在使用的应用程序非常复杂,但我应该只手写交易吗?

【问题讨论】:

    标签: javascript mysql node.js database node-mysql


    【解决方案1】:

    嗯。我觉得很害羞。

    答案是代码没有问题,但数据库有问题。在 MySQL 工作台中,在之前的调试工作中,我取消了查询 > 自动提交事务,这导致事务和语句在第一个应用于给定行后保持未提交(感谢 InnoDB 提供特定于行的锁)。

    虽然答案与代码无关,但在初始化数据库对象后添加它可能会产生相同的效果:

    pool.getConnection(function(err, conn){
      if(err instanceof Error){ throw err; }
      conn.query("SET AUTOCOMMIT=1", [], function(err){
        if(err instanceof Error){
          conn.release();
          throw err;
        }
        console.log("Auto-commit Transactions Enabled.");
        conn.release();
      });
    });
    

    我仍然在学习 MySQL 的工作原理。

    【讨论】:

      猜你喜欢
      • 2012-05-13
      • 2019-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多