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

Spring Boot事务异常求助:数据已保存仍报no transaction is in progress

问题:保存ChatUser成功但抛出TransactionRequiredException异常

处理/processSignUpForm请求时,ChatUser对象已成功存入数据库,但仍抛出jakarta.persistence.TransactionRequiredException: no transaction is in progress异常。

原因分析

  • 双重Spring上下文冲突:同时使用Spring Boot自动配置(@SpringBootApplication)和传统XML配置(spring-mvc-crud-demo-servlet.xml),导致两个上下文重复初始化事务管理器、SessionFactory等核心组件,事务管理逻辑混乱。
  • 事务注解边界混乱:控制器和服务层都添加了@Transactional,多层事务嵌套加上上下文冲突,导致事务提交后仍触发额外的持久化操作。
  • Open Session in View隐性操作:配置spring.jpa.open-in-view=true后,视图渲染阶段可能触发ChatUser中chatGroups的延迟加载,但此时事务已结束,无事务环境下的持久化操作抛出异常。
  • Session管理配置冲突:XML中手动配置LocalSessionFactoryBean,而Spring Boot自动配置了JpaTransactionManager,两者Session管理逻辑不兼容,导致事务上下文不一致。

解决方案

1. 移除传统XML配置,统一使用Spring Boot自动配置

  • 删除web.xml和spring-mvc-crud-demo-servlet.xml,Spring Boot会自动配置DispatcherServlet、视图解析器等组件。
  • XML中的视图解析器配置已在application.properties中存在,静态资源支持由Spring Boot默认处理。

2. 简化事务注解,明确事务边界

  • 移除控制器方法上的@Transactional,仅在服务层(ChatUserServiceImpl的方法)保留事务注解,避免事务嵌套混乱。
  • 删除application.properties中的spring.jpa.properties.hibernate.current_session_context_class,Spring Boot会自动适配合适的Session上下文。

3. 调整Open Session in View设置

  • 若视图层无需访问延迟加载的chatGroups,将spring.jpa.open-in-view设为false:
    spring.jpa.open-in-view=false
    
  • 若必须在视图层访问chatGroups,则在服务层提前初始化集合:
    @Override
    @Transactional
    public void saveChatUser(ChatUser theChatUser) {
        chatUserDao.saveChatUser(theChatUser);
        Hibernate.initialize(theChatUser.getChatGroups()); // 提前加载延迟集合
    }
    

4. 统一持久化API,简化代码

  • 利用Spring Data JPA简化DAO层,替换手动Session管理:
    public interface ChatUserRepository extends JpaRepository<ChatUser, Integer> {
    }
    
    服务层直接注入ChatUserRepository,无需手动操作Session:
    @Service
    public class ChatUserServiceImpl implements ChatUserService{
    
        @Autowired
        private ChatUserRepository chatUserRepository;
        
        @Override
        @Transactional
        public void saveChatUser(ChatUser theChatUser) {
            chatUserRepository.save(theChatUser);
        }
        // 其他方法同理替换
    }
    

5. 清理冗余配置

  • 删除application.properties中的spring.jpa.properties.hibernate.allow_update_outside_transaction=true,该配置为临时规避方案,不应长期保留。
  • 移除pom.xml中冗余的javax.servlet-api依赖,Spring Boot的spring-boot-starter-web已包含相关依赖。

内容的提问来源于stack exchange,提问作者Dhananjai Saini

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 14:29:50