@Transactional注解方法中save返回null时如何实现事务回滚?
Spring Boot + MongoDB 多集合保存回滚实现方案
前置依赖校验
首先要确保你的环境支持MongoDB事务,否则@Transactional注解不会生效:
- MongoDB版本 >= 4.0,且部署为副本集或分片集群(单节点MongoDB不支持事务)
- 项目中已配置MongoDB事务管理器,配置示例如下:
@Configuration public class MongoConfig { @Bean MongoTransactionManager transactionManager(MongoDatabaseFactory dbFactory) { return new MongoTransactionManager(dbFactory); } }
- 注意:你提到的Spring Boot 5不存在,当前最高正式版本为Spring Boot 3.x,若你使用的是Spring 5 + Spring Boot 2.x,只需保证Spring Data MongoDB版本 >= 2.1.0即可支持事务。
回滚逻辑实现
Spring的@Transactional注解默认会在方法抛出未捕获的RuntimeException或Error时触发事务回滚,你只需在两次保存操作后添加返回值校验,任意返回值为null时抛出运行时异常即可触发回滚。
同时你原始代码存在笔误:userRepository.save(builderToSave)中的builderToSave未定义,应为userToSave,修正后的完整代码如下:
@Service @RequiredArgsConstructor @Slf4j public class UserServiceImpl implements UserService{ private final AutoMapper autoMapper; private final UserRepository userRepository; private final AdminUserRepository adminUserRepository; @Override @Transactional(rollbackFor = Exception.class) // 可配置所有异常都回滚,按需调整范围即可 public SaveUserResponse create(UserDto newUser){ AdminUser adminUser = autoMapper.map(newUser, AdminUser.class); User userToSave = autoMapper.map(newUser, User.class); AdminUser savedAdminUser = adminUserRepository.save(adminUser); User savedUser = userRepository.save(userToSave); // 新增返回值校验,不满足条件直接抛出异常触发回滚 if (savedAdminUser == null || savedUser == null) { log.error("用户保存失败,返回值为空,触发事务回滚"); throw new RuntimeException("用户数据保存异常"); // 也可以抛自定义业务异常,只要是RuntimeException子类即可 } return new SaveUserResponse(savedUser); } }
额外注意事项
- 正常情况下Spring Data MongoDB的
save方法操作成功后不会返回null,若你担心保存失败,也可以直接捕获save方法抛出的异常,默认也会触发回滚 - 不要在
create方法内部捕获用于触发回滚的异常,否则事务管理器无法感知异常,不会触发回滚,异常需抛出到上层处理 - 若你的业务需要抛出检查异常(非RuntimeException子类),必须在
@Transactional注解中添加rollbackFor = 你的异常类.class配置,否则不会触发回滚
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

