MongoDB多文档事务需4.0副本集或4.2分片集群单节点不支持必须在session中显式startTransaction()和commitTransaction()仅支持常规集合且同库操作默认snapshot隔离超时60秒冲突报WriteConflict。必须先确认 MongoDB 版本和部署模式MongoDB 多文档事务只在 4.0副本集或 4.2分片集群中可用单节点 mongod 实例不支持。如果你用的是云服务如 Atlas默认开启副本集但本地用 mongod --port 27017 直接启动事务会直接报错 Transaction numbers are only allowed on a replica set member or mongos。实操建议本地开发用 mongod --replSet rs0 --port 27017 启动再执行 rs.initiate()Docker 用户确保容器启动时带 --replSet rs0 参数并在进入 shell 后调用 rs.initiate()检查是否就绪连接后运行 rs.status()看到 members 列表且状态为 PRIMARY 或 SECONDARY 才算成功事务必须在 session 中显式启动和结束MongoDB 不像 SQL 那样自动管理事务上下文所有事务操作都绑定到一个 session 对象且必须手动调用 startTransaction() 和 commitTransaction()或 abortTransaction()。漏掉任一环节都会导致操作被当作普通写入执行——也就是「你以为在事务里其实根本没有」。常见错误现象没调用 startTransaction() 就直接执行 collection.insertOne() → 操作立即生效不回滚调用了 startTransaction() 但忘记 commitTransaction() → 事务长时间挂起占用资源最终超时自动 abort默认 60 秒在事务中调用未启用读关注的查询如 find() 不带 readConcern: snapshot→ 可能读到未提交数据或报错 Read concern snapshot is not available for this operation示例Node.js driverconst session client.startSession();try { await session.withTransaction(async () { await db.collection(orders).insertOne({ status: pending }, { session }); await db.collection(inventory).updateOne( { sku: abc }, { $inc: { qty: -1 } }, { session } ); });} finally { await session.endSession();}事务内集合必须是副本集上的 capped collection 以外的常规集合事务不支持 capped 集合、system.* 集合如 system.users、以及任何使用 collation 且 collation 不为 simple 的集合除非显式指定 readConcern: snapshot。最常踩的坑是你在测试时建了个 capped: true 的日志集合然后试图在里面做事务更新结果报错 Transactions are not supported on capped collections。 Mokker AI AI产品图添加背景