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

测试类加@Transactional仍报TransactionRequiredException无法执行更新删除查询

问题根因

你遇到的问题核心是测试类配置异常+可能的注解导包错误,导致测试类上的@Transactional没有生效,而@Modifying标注的更新/删除类方法强制要求运行在事务环境中,所以抛出对应异常。
其中测试类上多余的@SpringBootApplication是最常见的诱因:该注解是项目主启动类专用,加在测试类上会让测试上下文优先使用测试类作为配置源,大概率不会加载主项目的事务自动配置,最终导致@Transactional注解失效。

具体修复方案

1. 清理测试类冗余注解

删除测试类上的@SpringBootApplication注解,调整后的测试类结构如下:

// 注意导包是org.springframework.transaction.annotation.Transactional
import org.springframework.transaction.annotation.Transactional;
import org.springframework.boot.test.context.SpringBootTest;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;

@Transactional
@SpringBootTest
public class RepoTest {
    
    private final ExampleRepo repository;

    @Autowired
    public RepoTest(final ExampleRepo repository){
        this.repository = repository;
    }

    @Test
    void testExample() {
        repository.exampleQuery("example", 1);
    }
}

2. 确认@Transactional的导包正确性

必须导入Spring框架提供的org.springframework.transaction.annotation.Transactional,如果误导入了javax.transaction.Transactional,Spring的事务管理器不会识别该注解,自然不会开启事务。

3. 多事务管理器场景适配

如果你的项目配置了多个事务管理器,可以在@Transactional注解上指定要使用的事务管理器名称:

@Transactional(transactionManager = "jpaTransactionManager")

4. 无侵入兼容方案

如果不想修改测试类原有结构,也可以在测试包下单独自定义Repository子接口,给对应方法补充@Transactional注解,完全不会影响主代码库:

// 仅存放在测试代码包下
public interface TestExampleRepo extends ExampleRepo {
    @Override
    @Transactional
    int exampleQuery(String example, int id);
}

测试时直接注入TestExampleRepo即可正常调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 12:36:02