SpringBoot 3.0多模块项目操作PostgreSQL无法保存数据,抛出‘no transaction is in progress’异常
SpringBoot 3.0多模块项目操作PostgreSQL无法保存数据,抛出‘no transaction is in progress’异常
我来帮你梳理下这个问题的可能原因和解决方案,结合你的代码描述,大概率是事务配置在多模块场景下没有正确生效,或者Spring Bean的管理出了问题:
1. 首要检查:你的ServiceImpl是否被Spring容器管理?
看你的代码,ServiceImpl只加了@Transactional注解,但没有@Service或者@Component注解!这就导致Spring不会把这个类实例化为Bean,@Transactional自然也不会生效——毕竟Spring的事务是基于AOP代理Bean实现的,连Bean都不是,谈何事务?
赶紧给ServiceImpl加上@Service注解:
@Service @Transactional public class ServiceImpl implements Service { @Autowired private Repository repository; @Override public void saveInfo(String type, Timestamp ts, String data) { Entity entity = new Entity(new EntityId(type, ts), data); var returnedObject = repository.saveAndFlush(entity); } }
2. 确认配置类和组件的扫描范围
你的CommonConfig在common模块,而主应用类在另一个模块,要确保主应用能扫描到common模块的所有组件(包括配置类、Service、Repository):
- 给主应用类的
@SpringBootApplication加上扫描包范围,覆盖common模块的包路径:
@SpringBootApplication(scanBasePackages = {"com.sample"}) public class MainApplication { public static void main(String[] args) { SpringApplication.run(MainApplication.class, args); } }
- 如果
CommonConfig没被自动扫描到(比如包路径不在com.sample下),可以手动用@Import引入:
@SpringBootApplication(scanBasePackages = {"com.sample.main"}) @Import(CommonConfig.class) public class MainApplication { // ... }
3. 多数据源冲突(Cassandra可能影响)
你提到项目里还有Cassandra连接,如果同时配置了PostgreSQL和Cassandra两个数据源,Spring可能无法自动识别默认的事务管理器,导致@Transactional找不到对应的事务资源。
解决方法:
- 在
@Transactional注解里显式指定PostgreSQL的事务管理器(默认JPA事务管理器的Bean名称是transactionManager):
@Service @Transactional(value = "transactionManager") public class ServiceImpl implements Service { // ... }
- 或者在
CommonConfig里把PostgreSQL的事务管理器标记为默认(用@Primary):
@Configuration @EnableTransactionManagement @EntityScan("com.sample.folder") @EnableJpaRepositories("com.sample.folder") public class CommonConfig { @Primary @Bean public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) { return new JpaTransactionManager(entityManagerFactory); } }
4. 再理解save和saveAndFlush的差异
你提到save没报错但不保存,saveAndFlush直接抛异常,这完全符合“没有事务”的表现:
save方法是延迟提交的,在无事务场景下,Hibernate不会执行实际的insert操作;saveAndFlush会强制立即执行SQL,此时发现没有活跃事务,就会抛出TransactionRequiredException。
按照上面的步骤排查后,应该能解决问题。先从第1、2步开始,这是最常见的低级错误,也是最容易解决的。
备注:内容来源于stack exchange,提问作者Fay007
相关产品推荐
相关产品推荐

