MongoDB事务更新2文档偶发WriteConflict及配置调整疑问
MongoDB 5.0.14 多文档事务偶发WriteConflict问题咨询
我在使用MongoDB 5.0.14版本时,通过事务仅更新2个文档,日志中却偶发出现以下错误:
MongoServerError: WriteConflict error: this operation conflicted with another operation. Please retry your operation or multi-document transaction.
根据查阅的文档,该问题通常在修改超过1000个文档时出现,但我仅操作2个文档,且错误为随机触发,多数情况下逻辑可正常执行。
相关代码如下:
exports.setArticleView = async (req, res) => { const userId = req.user._id; const { article_id } = req.body; // Start a session const session = await mongoose.startSession(); try { // Start a transaction session.startTransaction(); await ArticleView.create([{ articleId: article_id, user: userId }], { session }); await Article.updateOne({ _id: article_id }, { $inc: { views: 1 } }, { session }); // Commit the transaction await session.commitTransaction(); return res.status(200).json({ success: true }); } catch (error) { return res.status(500).json({ success: false }); } finally { // End session session.endSession(); } };
我推测错误触发场景为:
- 某用户浏览文章,事务启动;
- 另一用户几乎同时浏览该文章,启动事务;
- 因第一个事务未完成,第二个事务中止。
该推测基于官方文档中的这段描述:
如果存在正在进行的多文档事务,影响相同数据库或集合的新DDL操作会在事务之后等待。当存在这些待处理的DDL操作时,访问相同数据库或集合的新事务无法获取所需锁,等待
maxTransactionLockRequestTimeoutMillis(默认值为5ms)后会中止。
我认为增大maxTransactionLockRequestTimeoutMillis参数可能解决问题,但想咨询社区:调整该配置会带来哪些潜在影响?
内容的提问来源于stack exchange,提问作者NeNaD
相关产品推荐
相关产品推荐

