序列化transaction.commit()不提交数据

时间:2019-12-03 23:32:53

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

我们在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();
}

在上面的代码中,看起来该代码按预期执行了proc,并返回了result1,result2。但是它没有在transaction.commit();

处保留该过程的结果

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

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

另一个重要的一点是,SQL Server当时的负载很重。 transaction.commit()提交失败时是否有机会不抛出错误?还是SQL Server会由于某种原因将其回滚,而sequelize无法引发错误?

1 个答案:

答案 0 :(得分:0)

您忘记将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;