MongoDB 4.0仅支持副本集多文档事务,4.2起才支持分片集群分布式事务;4.0连接mongos会报TransactionNotSupportedOnShardedCluster错误,而4.2依赖二阶段提交与分片oplog拆分实现ACID。

MongoDB 4.0 和 4.2 的事务能力有本质差异:4.0 仅支持副本集(replica set)上的多文档事务,4.2 才真正支持跨分片(sharded cluster)的分布式事务——这不是简单升级,而是部署场景的硬性门槛切换。
4.0 事务只能跑在副本集上,不能用在分片集群
如果你连接的是 mongos 地址(比如 "mongodb://host1:27017,host2:27017/config?replicaSet=rs0"),但后端是分片集群,startTransaction() 会直接报错:TransactionNotSupportedOnShardedCluster。4.0 根本不识别分片拓扑,驱动尝试发起事务时会被 mongos 拒绝。
- 验证方式:执行
db.runCommand({isMaster: 1}),返回中含"msg": "isdbgrid"表示这是 mongos 节点,4.0 不支持 - 必须用 replica set 连接串,例如
"mongodb://node1:27017,node2:27017,node3:27017/?replicaSet=myrs" - 即使你只写一个分片上的数据,4.0 也无权协调多个 shard,事务机制本身就不启动
4.2 开始支持 sharded cluster,但依赖二阶段提交和 oplog 拆分
4.2 的核心突破是让事务能横跨多个 shard,并保证 ACID。它不再把整个事务塞进单条 oplog(4.0 限制 16MB),而是按需生成多条 oplog 记录,每条最大 16MB,靠二阶段提交(2PC)协调各 shard 提交或回滚。
- 驱动必须升级到
mongo-java-driver 3.11+或对应语言的 4.2+ 兼容版本,否则session.startTransaction()会被静默忽略 - 事务超时默认 60 秒(可设
maxTimeMS),超时即中止并回滚,这点 4.0/4.2 一致,但 4.2 在分片间传播超时更复杂 - 如果事务涉及的某个 shard 正在做 balance 或有 arbiter 加入,整个事务会失败——4.0 副本集没这个风险
集合创建、锁行为、系统库限制基本一致,但 4.4 才放开部分能力
4.0 和 4.2 都禁止在 config、admin、local 库及 system.* 集合操作;都不支持 capped collection;都要求 WiredTiger 引擎;也都无法在事务里调用 explain()。
- 两者都**不支持事务内显式建集合**(
db.createCollection()),4.4 才放开 - 隐式建集合(如 insert 到不存在的 collection)在 4.0/4.2 都允许,但 4.2 在分片集群下要求所有 shard 上该 collection 必须能统一创建,否则事务失败
- 锁等待默认 5ms,超时即中止——这个行为没变,但 4.2 分片环境下锁竞争更易触发
真正决定你能不能用事务的,不是 MongoDB 版本号,而是你连的是 replica set 还是 mongos。4.0 写再复杂的业务逻辑,只要后端是分片集群,事务就根本走不通;4.2 则必须确认 driver、部署拓扑、shard 状态三者同时达标,缺一不可。

















