【问题标题】:Sequelize transaction.commit() doesn't commit the dataSequelize transaction.commit() 不提交数据
【发布时间】:2020-03-28 17:15:51
【问题描述】:

我们在 NodeJS 中使用 sequelize 与数据库 (SqlServer) 对话。 我们使用 Sequelize:4.44.2 和 Node:10.16 几个月来一直运行良好。但是我们昨天遇到了一个问题,我还没有找到根本原因。 我们从我们的 NodeJS 应用程序中调用了一堆过程。

const transaction = await sequelize.transaction();
try {
      const dbquery = sequelize.query("EXEC proc_a @param1=:param1", { replacements: { param1: a},
            transaction: transaction,
            type: sequelize.QueryTypes.SELECT
        });

     const result1 = await Promise.resolve(dbquery);

     const dbquery2 = sequelize.query("EXEC proc_b @param1=:param1", { replacements: { param1: a},
            transaction: transaction,
            type: sequelize.QueryTypes.SELECT
        });

     const result2 = await Promise.resolve(dbquery2);
     await transaction.commit();
        // return result1, result2;
} catch(err){
    await transaction.rollback();
}

在上面的代码中,看起来代码按预期执行了 procs 并返回了 result1、result2。但它并没有将程序的结果保留在transaction.commit();

故障排除步骤: 我可以确认,当其中一个过程执行失败或过程超时时,事务会回滚。 但是昨天,transaction.commit() 没有抛出任何错误,也没有将结果持久化到数据库中。

查看日志,transaction.commit() 似乎在 5 毫秒内完成。

另一个重要的一点是,当时 SQL Server 的负载很重。 transaction.commit() 在提交失败时是否有可能不会引发错误?或者 SQL server 会因为某种原因将其回滚,而这 sequelize 未能引发错误?

【问题讨论】:

    标签: node.js sql-server sequelize.js


    【解决方案1】:

    你忘了把await放在sequelize.transaction()之前

    而不是

    const transaction = sequelize.transaction();
    

    试试

    const transaction = await sequelize.transaction();
    

    因此,不是在任何地方获取transaction 对象,而是获取Promise,而后者又会解析transaction 对象。

    更新 #1: sequelize.query 本身返回一个 Promise。所以不要遵循以下几行

    const result1 = await Promise.resolve(dbquery);
    const result2 = await Promise.resolve(dbquery2);
    

    使用以下

    const result1 = await dbquery;
    const result2 = await dbquery2;
    

    【讨论】:

    • 感谢您的回答。当我复制代码时,这是一个错字。我的代码在获得交易时实际上已经等待。我已经修改了问题。您知道为什么它实际上可能没有持续存在吗?
    • 我已经在 UPDATE 部分更新了我的答案,请查看@Bala。
    • 酷。但这并没有什么不同,对吧?我可以理解 sequelize.query 本身会返回一个承诺。但是做 Promise.resolve(query) 不会造成任何伤害。
    • 是的,它在执行承诺方面没有区别。 Promise.resolve(query) 不会造成任何伤害。
    • 您能想到为什么提交没有保留记录并且也没有抛出任何错误的任何其他原因? :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 2017-03-20
    • 2011-02-23
    • 2018-09-27
    • 1970-01-01
    相关资源
    最近更新 更多