gpt4 book ai didi

node.js - 如何使用nodejs、express和mongoose在一个函数中保持两个操作的一致性

转载 作者:太空宇宙 更新时间:2023-11-04 01:47:25 25 4
gpt4 key购买 nike

最近,我用express和mongoose编写了一个nodejs应用程序。

当我在一个函数中更新两个集合时,问题就出现了。

代码段如下所示。

exports.doVote = async (req, res) => {
// some codes...

// Operation 1
const voteNumInfo = await VoteNumInfo.findOneAndUpdate({ activityId, vodId },
{ vodId, vodName, activityId, categoryId, categoryName, $inc: { voteNum: 1, showNum: 1 } },
{ new: true, upsert: true, setDefaultsOnInsert: true });

// Operation 2
await VoteInfo.create({ vodId, vodName, activityId, categoryId, voteDate, stbId, ptag });

// some codes...
}

其中VoteNumInfo是投票统计模型,VoteInfo是投票记录模型。

当操作2出错时,操作1无法回滚。

有什么解决办法吗? Spring 框架中类似于 @transaction 的东西?

请帮助我。

最佳答案

在 MongoDB 中,所有要写入的操作在文档级别都是原子的。这意味着即使一个写操作影响多个文档,每个操作都是原子的。因此,mongodb 本身不提供事务处理方式(文档 here 中有更多信息)

解决问题的简单方法是捕获异常,如果第一个查询已成功执行而第二个查询未成功执行,您可以执行一个查询来撤消之前执行的操作(使用 $dec)

在 Mongodb 文档中,有一种模式可以解决这种情况,包括状态等,但在您的情况下,您可能不需要如此复杂的东西。它被称为Two-phase commit pattern 。看看是否有帮助。

关于node.js - 如何使用nodejs、express和mongoose在一个函数中保持两个操作的一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50940761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com