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
相关产品推荐
相关产品推荐

