【发布时间】:2022-12-18 22:03:06
【问题描述】:
在使用 express 的节点应用程序中,我有一条使用下面显示的方法的路线。
我创建了一个 transaction 但不在 update 方法中使用它。 Sequelize配置为不是使用托管事务并将自动提交设置为 false。
当此路由被多次调用/每秒大约 7 - 10 次(调用次数不同)时,我最终得到 5 个左右的悬空事务,即使在方法调用结束时为事务调用了提交。(由于这些悬空事务,后续调用和我的节点应用程序无法再进行数据库调用)
但如果我在 params 对象中传递 transaction,则不会发生此行为。而且我没有悬空交易。
发生这种情况的原因可能是什么?
updateItem = (obj) => {
this.logDebug(`Updating item - `, obj);
return new Promise(async (resolve, reject) => {
let transaction;
try {
transaction = await this.getTransaction();
} catch(error) { return reject(error);
const params = {
where: {
id: obj.id
},
returning: true,
plain: true
};
return models[modelName].
update(obj, params).then(result => {
if (!result) { return result; }
result = JSON.parse(JSON.stringify(result[1]));
return result;
}).
then(async (result) => {
await transaction.commit();
return resolve(result);
}).
catch(async error => {
this.logError(`Failed to update - `, error);
await transaction.rollback();
return reject(error);
});
});
};
导致悬空交易。
const params = {
where: {
id: obj.id
},
returning: true,
plain: true
};
没有悬空交易发生。
const params = {
where: {
id: obj.id
},
returning: true,
plain: true,
transaction
};
使用Nodejs 12.4、Sequelize 5.21.9、postgres 9.x
仅在 params 对象中使用创建的 transaction 不会以某种方式导致悬空事务。
在 params 中不使用 transaction 会导致此悬空事务问题。
想知道这种行为的原因吗?这是我的代码的错误吗?或者Sequelize 的错误?
【问题讨论】:
-
您可以使用
async/await或then/catch但不能同时使用两者,这很混乱且容易出错。您能否将以return models[modelName].开头的代码转换为直接以await开头的代码并尝试/捕获?
标签: node.js express transactions sequelize.js postgres-14