Spring Data自定义查询删除2天前记录报TransactionRequiredException如何解决
问题根因
org.springframework.dao.InvalidDataAccessApiUsageException 嵌套的 javax.persistence.TransactionRequiredException 异常,核心原因是 Spring Data JPA 中所有带 @Modifying 注解的 UPDATE/DELETE 类 DML 操作,必须在事务上下文内执行,你当前的代码缺少事务配置,所以触发报错。
解决方案
- 第一步:给业务层的
deleteOldRecords方法添加@Transactional注解,注意导入 Spring 提供的事务注解包,不要导入 JPA 原生的同名注解:
import org.springframework.transaction.annotation.Transactional; @Override @Transactional public void deleteOldRecords(long timestamp) { testDao.deleteOldRecordsCRUD(timestamp); }
- 第二步(可选优化):可以将 DAO 层方法的返回值从
void修改为int,会直接返回本次操作实际删除的记录行数,方便校验执行结果是否符合预期:
@Repository public interface TestItemDAO extends CrudRepository<TestItem, Long> { @Modifying @Query(value = "DELETE FROM TEST_TABLE tt WHERE tt.timestamp <= :timestamp", nativeQuery = true) int deleteOldRecordsCRUD(@Param("timestamp") long timestamp); }
- 第三步(异常场景排查):如果添加注解后仍报错,检查项目是否开启了事务管理:Spring Boot 项目默认自动开启事务支持,传统 Spring 项目需要在配置类上添加
@EnableTransactionManagement注解手动开启。
内容的提问来源于stack exchange,提问作者JustQuest
相关产品推荐
相关产品推荐

