【发布时间】: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