javascript - Node MySQL : Transaction with Varying Queries

标签 javascript mysql node.js database node-mysql

问题

我正在尝试为我的 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);
})

我尝试过的事情

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

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

我的问题

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

最佳答案

嗯。我感觉很羞涩。

答案是代码没有问题,但是数据库有问题。在 MySQL Workbench 中,在之前的调试工作中,我取消选中“查询”>“自动提交事务”,这会导致事务和语句在第一个事务和语句应用于给定行后保持未提交状态(感谢 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 的工作原理。

关于javascript - Node MySQL : Transaction with Varying Queries,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39630173/

相关文章:

JavaScript 排序比较函数

mysql - 如何将 MySQL 表更改为 UTF-8?

mysql - Facebook Graph API 2 - 存储在数据库中时的用户 ID 类型

javascript - 填充中的 Mongoose 排序不起作用

javascript - Javascript 中的 onLoad 函数

javascript - 如何判断 js 类方法是否是静态的?

javascript - 最小长度验证器在 Mongoose 中不起作用

node.js - NodeJS Express - 向特定集群工作人员发送特定路由?

javascript - Angular : How to disable an anchor tag out of an array (ng-repeat) of anchor tags

mysql - 传递参数是where mysql , procedure之后的字段