我们在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无法引发错误?
答案 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;