讲师中心 微信公众号
AI工具推荐 视频效率加速

MongoDB 事务如何通过 Mongoose 使用_Node.js 环境下 session 机制的实战应用

老伟吖_9945

老伟吖_9945

发布时间:2026-04-09 12:43:33

|

1056人浏览过

|

来源于php中文网

原创

Mongoose 6.0+ 默认支持 MongoDB 原生事务,但需在连接就绪(readyState === 1)后调用 startSession() 获取有效 session,且每个事务必须使用独立 session 并显式传入 { session } 选项;session.withTransaction() 自动处理重试与回滚,手动方式需严格调用 start/commit/abortTransaction() 并及时 endSession() 防止资源泄漏。

mongodb 事务如何通过 mongoose 使用_node.js 环境下 session 机制的实战应用

Mongoose 6.0+ 默认支持 MongoDB 原生事务,但必须显式创建并传入 session,否则 session.startTransaction() 会报错或静默失效。

为什么 session.startTransaction() 报 TopologyDescription not connected

这不是事务语法问题,而是 session 没绑定到可用连接。Mongoose 的 startSession() 必须在连接就绪后调用,且不能复用已结束的 session。

  • mongoose.connect() 是异步操作,需等 mongoose.connection.readyState === 1 后再调用 mongoose.startSession()
  • 每个事务必须使用独立 session,不能把同一个 session 多次 startTransaction()
  • 若用 mongoose.connection.db.startSession()(原生 driver 方式),会绕过 Mongoose 的连接管理,易触发 topology 错误

session.withTransaction() 和手动 commitTransaction() 怎么选

withTransaction() 是封装好的错误自动回滚 + 重试逻辑,适合多数业务场景;手动控制适用于需要精细干预提交/回滚时机,或要捕获中间状态。

  • session.withTransaction(async () => { ... }):自动处理 transientTransactionError 重试(最多 5 次),失败时自动 abortTransaction()
  • 手动流程必须严格按顺序:session.startTransaction() → 操作 → await session.commitTransaction() 或 await session.abortTransaction()
  • 手动方式下,未 commit 或 abort 的 session 会占用资源,超时(默认 60 秒)后被服务端强制终止,但不会释放客户端引用

跨 Model 写操作必须共用同一个 session

Mongoose 的 save()、deleteOne()、updateMany() 等方法只有显式传入 { session } 选项才会纳入当前事务上下文。

  • 错误写法:await User.create({...}) —— 不进事务,即使有活跃 session
  • 正确写法:await User.create({...}, { session }) 或 await user.save({ session })
  • 注意:Model.insertMany() 支持 { session },但 bulkWrite() 的每个操作都得单独加 session 字段(如 { updateOne: { filter, update, session } })
  • 查询操作(find、findOne)加 { session } 可读取事务中未提交的数据,用于“读己之所写”,但不强制要求

事务里调用 aggregate() 或 countDocuments() 的兼容性

MongoDB 4.2+ 支持事务内聚合管道(含 $lookup、$facet),但 Mongoose 的 Model.aggregate().session(session) 必须链式调用,且不能混用非事务集合。

  • await User.aggregate([...]).session(session).exec() ✅ 有效
  • await User.countDocuments(filter, { session }) ✅ 支持(Mongoose 6.7+)
  • ⚠️ Model.findOne().session(session) 在事务中返回的是快照数据,但若管道里用了 $out 或 $merge,会直接报错:不支持事务内写入到其他集合
  • 事务内禁止跨分片写入(sharded cluster 下需确保所有操作落在同一分片键范围内)

真正容易被忽略的是 session 生命周期管理:它不是 request-scoped 自动清理的,你得确保每次事务结束后调用 session.endSession(),否则连接池里的 session 对象会堆积——尤其在高并发短事务场景下,可能触发 “Too many sessions” 服务端限制。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

相关专题

更多
node.js调试
node.js调试

node.js调试可以使用console.log()输出调试信息、断点调试和第三方调试工具。详细介绍:1、console.log()输出调试信息,通过在代码中插入console.log()语句,开发人员可以在控制台输出变量的值、函数的执行结果等信息,以便观察代码的执行流程和状态;2、断点调试,可以在代码中设置断点,以便在特定位置暂停代码的执行,观察变量的值和执行流程等。

12009

2023.09.19

JavaScript 全栈开发基础(Node.js + 前端)
JavaScript 全栈开发基础(Node.js + 前端)

本专题系统介绍 JavaScript 在全栈开发中的核心知识结构,涵盖 Node.js 基础、Express/Koa 接口构建、前端交互设计、模块化与包管理、数据库连接、前后端数据通信与部署流程。通过完整项目示例,帮助学习者掌握从浏览器到服务器的一体化开发能力,实现真正意义上的全栈入门。

454

2025.11.26

Node.js后端开发与Express框架实践
Node.js后端开发与Express框架实践

本专题针对初中级 Node.js 开发者,系统讲解如何使用 Express 框架搭建高性能后端服务。内容包括路由设计、中间件开发、数据库集成、API 安全与异常处理,以及 RESTful API 的设计与优化。通过实际项目演示,帮助开发者快速掌握 Node.js 后端开发流程。

781

2026.02.10

JavaScript Node.js流处理与高效数据管道构建实践
JavaScript Node.js流处理与高效数据管道构建实践

本专题聚焦 Node.js 在大规模数据处理场景中的应用,系统讲解 Stream 流机制、背压控制、管道(Pipe)处理以及文件与网络数据流的高效传输方式。内容包括可读流、可写流、双工流与转换流的实现原理,并结合实际案例构建高性能数据处理管道,帮助开发者提升数据处理效率与系统吞吐能力。

344

2026.04.07

TypeScript Node.js 全栈工程化与Monorepo架构实践
TypeScript Node.js 全栈工程化与Monorepo架构实践

本专题围绕 TypeScript 在 Node.js 全栈开发中的工程化实践展开,系统讲解 Monorepo 架构设计、包管理策略、模块复用机制以及服务端与前端统一类型系统的构建方法。通过真实项目案例,帮助开发者提升大型全栈项目的可维护性与协作效率。

718

2026.06.16

session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

580

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

876

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

1946

2025.08.19

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

0

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn