Node.js Sequalize事务回滚不适用于多个项目(节点js)
我有一个对象数组,我希望sequelize中有一个原子事务Node.js Sequalize事务回滚不适用于多个项目(节点js),node.js,transactions,sequelize.js,Node.js,Transactions,Sequelize.js,我有一个对象数组,我希望sequelize中有一个原子事务 updateCreatorDb(resultObj) { return Promise.map(resultObj.rows, function (result: any) { return sequelize.transaction({ autocommit: false }).then(function (t) { return postgresService.updateByIdTrans(result.i
updateCreatorDb(resultObj) {
return Promise.map(resultObj.rows, function (result: any) {
return sequelize.transaction({ autocommit: false }).then(function (t) {
return postgresService.updateByIdTrans(result.id, "user_transactions",
{ status: "sucess" }, t).then(function () {
return postgresService.updateByIdTrans(result.to_user, "user",
{ balance: sequelize.literal('balance+' + result.amount) }, t).then(function (data) {
t.commit();
}, function (error) {
t.rollback();
})
}, function (error) {
t.rollback();
});
});
});
}
updateByDTrans(id:number,model:string,attributes,t:Transaction):承诺{
让承诺=新承诺((解决:功能,拒绝:功能)=>{
logger.info(“更新表”+模型);
返回模型[model].update(属性,{where:{id:id},返回:true},{transaction:t})
。然后((结果)=>{
如果(results.length>0){
info(`Updated Object with id${id}.`);
解析(JSON.stringify(结果[1][0]);
}否则{
info(`id为${id}的对象不存在。`);
解析(JSON.stringify(`id为${id}的对象不存在。`);
}
}).catch((错误:error)=>{
logger.error(错误消息);
拒绝(错误);
});
});
回报承诺;
}
若第二个update语句失败,那个么我想回滚第一个update语句,因为它们使用相同的事务对象,并且在第二个update语句成功之前不会提交
。使用此代码,如果第二个update语句中有错误,则只回滚第二个update语句,并提交第一个update语句。在您提供的示例中,您在
.map()
方法的每个循环中创建新事务,因此每次更新
成功时,它都会提交,因此,如果错误发生在n
循环中,所有n-1
事务都会提交,更改会保存在数据库中感谢您的回复。但我的问题是,如果出现错误(n-1),则(n-1)应该回滚。我现在才明白。我认为updatebydtrans
函数源代码在这种情况下对解决您的问题非常有用更新的请看一看
updateByIdTrans(id: number, model: string, attributes, t: Transaction): Promise<void> {
let promise = new Promise<void>((resolve: Function, reject: Function) => {
logger.info("updating table " + model);
return models[model].update(attributes, { where: { id: id }, returning: true }, { transaction: t })
.then((results) => {
if (results.length > 0) {
logger.info(`Updated Object with id ${id}.`);
resolve(JSON.stringify(results[1][0]));
} else {
logger.info(`Object with id ${id} does not exist.`);
resolve(JSON.stringify(`Object with id ${id} does not exist.`));
}
}).catch((error: Error) => {
logger.error(error.message);
reject(error);
});
});
return promise;