Spring Boot 2.2.0+ 才支持 MongoDB 事务,需副本集/分片集群、含 replicaSet 的连接串、手动配置 MongoTransactionManager Bean,且事务仅限同库、同分片,不支持跨库或 $out 等操作。

Spring Boot 2.2.0+ 才能真正启用 MongoDB 事务,低于这个版本的 @Transactional 对 MongoDB 完全无效——不报错、不回滚、直接提交。
确认 MongoDB 部署模式和连接字符串是否合规
事务不是加个注解就自动生效的,底层驱动会静默跳过。首要条件是 MongoDB 必须运行在副本集(replica set)或分片集群(sharded cluster)上,单节点 standalone 模式不支持。
连接字符串里必须显式带 replicaSet 参数,否则 Spring Boot 不会触发事务管理器自动配置:
spring.data.mongodb.uri=mongodb://localhost:27017,localhost:27018,localhost:27019/mydb?replicaSet=rs0- 如果连的是分片集群,应指向
mongos实例,且 MongoDB 版本 ≥ 4.2 - URI 中不能漏掉副本集成员列表(多个地址用逗号分隔),也不能把
?replicaSet=...写成&replicaSet=...
手动声明 MongoTransactionManager Bean 是必须步骤
Spring Boot 不会因为加了 @EnableTransactionManagement 就自动为 MongoDB 配事务管理器。哪怕你 URI 写对了,缺了这一步,@Transactional 也只对 JPA/MyBatis 生效,MongoDB 被完全忽略。
正确写法(注意参数类型是 MongoDatabaseFactory,不是旧版 MongoTemplate):
@Configuration
public class MongoConfig {
@Bean
public MongoTransactionManager transactionManager(MongoDatabaseFactory dbFactory) {
return new MongoTransactionManager(dbFactory);
}
}
- 如果项目同时用了 MySQL 和 MongoDB,必须给两个事务管理器起不同名字,例如
@Bean("mongoTransactionManager")和@Bean("myBatisTransactionManager") - 调用时需显式指定:
@Transactional(transactionManager = "mongoTransactionManager") - 不要复用多个
MongoTemplate实例——事务内所有操作必须来自同一个MongoDatabaseFactory绑定的 template
@Transactional 在 MongoDB 中的实际限制
它不是“跨库通用事务”,很多你以为能做的事,其实被 MongoDB 服务端硬性禁止:
- 只能操作同一数据库(
database)下的 collection,跨库事务直接失败 - 不支持
$out、$merge、mapReduce等聚合阶段 - 在分片集群中,所有操作必须落在同一分片上;否则事务开启即抛
IllegalOperation - 默认超时 60 秒,可通过
@Transactional(timeout = 30)调整,但要和 MongoDB 的transactionLifetimeLimitSeconds配置一致 - 异常必须往外抛——
try-catch吞掉异常,事务就认为成功并提交
事务没生效?先看这几个地方
事务失败通常不抛明显异常,日志里也难定位。最容易被忽略的点是:
- MongoDB 日志等级不够(
logLevel: 1或更高),关键 session 初始化失败信息藏在TRANSACTION类别下 - 应用启动时没打印出
MongoTransactionManagerBean 创建日志,说明自动配置没触发,大概率是 URI 缺replicaSet - 用了
ReactiveMongoTemplate却配了阻塞式的MongoTransactionManager,类型不匹配导致事务失效 - 事务方法不是 public,或被同类内其他方法直接调用(绕过代理),
@Transactional根本不生效
事务边界比想象中更窄,别假设它能兜住所有数据一致性问题——尤其是混用 MongoDB 和 MySQL 时,ChainedTransactionManager 只是顺序执行,任一环节失败,另一个已提交的操作无法自动回滚。


















