MongoDB 4.0 事务仅支持副本集且必须初始化,单机部署报错;不支持分片集群;超时固定60秒不可调;仅WiredTiger引擎可用,MMAPv1需手动迁移;错误表现隐蔽,易致生产数据不一致。

事务只支持副本集,单机部署直接报错
MongoDB 4.0 的事务功能**强制依赖副本集(Replica Set)**,哪怕你只起一个节点(mongod --replSet rs0),也必须执行 rs.initiate() 初始化,否则调用 session.startTransaction() 会立即 panic 或抛出 Transaction numbers are only allowed on a replica set member。单点部署(Standalone)完全不可用,这点和 4.2+ 版本一致,没有改进。
分片集群事务在 4.0 中根本不可用
4.0 版本**不支持任何分片集群(Sharded Cluster)上的事务**——连基础启动都失败。直到 4.2 才首次引入分片事务支持,但仍有硬限制:事务内所有操作必须落在同一分片上,且不能包含 createCollection、dropCollection 等元数据操作。如果你的业务已分片,4.0 下只能绕开事务,或降级为应用层补偿逻辑。
超时时间固定为 60 秒,无法动态调整
4.0 的事务生命周期默认硬编码为 60 秒,超时即自动 abort,且**不提供任何服务端配置项修改该值**。到了 4.2,可通过 db.adminCommand({setParameter:1, transactionLifetimeLimitSeconds: 120}) 动态延长;4.4 更进一步支持 per-transaction 覆盖(maxTimeMS 传入 startTransaction())。这意味着 4.0 下长流程事务(如含外部 HTTP 调用、批量计算)极易静默失败。
WiredTiger 是唯一可用引擎,MMAPv1 无任何回退路径
4.0 要求存储引擎必须是 wiredTiger,检查方式是运行 db.serverStatus().storageEngine.name,返回非 "wiredTiger" 则事务不可用。这点在后续版本中未放宽——5.0/6.0 依然如此。但关键区别在于:4.0 升级旧实例时,若原用 MMAPv1,**不会自动迁移引擎**,必须手动导出再导入,否则事务始终 disabled;而 4.4+ 提供了更平滑的在线迁移工具链(虽仍需停写窗口)。
真正容易被忽略的是:4.0 的事务错误表现非常“安静”。比如连接串漏了 ?replicaSet=rs0 或驱动版本低于 v1.4.0,startTransaction() 可能不报错,但后续写入实际以普通非事务模式执行——数据不一致风险完全暴露在生产环境里,日志和监控也难捕获。


















