You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 15:08:13