Java 用@Transactional注释的服务方法的Spring引导集成测试(传播=传播。需要\u NEW)

Java 用@Transactional注释的服务方法的Spring引导集成测试(传播=传播。需要\u NEW),java,spring-boot,spring-data-jpa,spring-transactions,spring-test,Java,Spring Boot,Spring Data Jpa,Spring Transactions,Spring Test,我正在使用Spring Boot并尝试编写一个集成测试,其中调用了一个带注释的方法:@Transactional(propagation=propagation.REQUIRES_NEW) 我的测试方法注释如下: @Test @Transactional @Sql(scripts = { "/sql/insert_some_records.sql" }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) 通过这种配置

我正在使用Spring Boot并尝试编写一个集成测试,其中调用了一个带注释的方法:
@Transactional(propagation=propagation.REQUIRES_NEW)

我的测试方法注释如下:

@Test
@Transactional
@Sql(scripts = {
        "/sql/insert_some_records.sql"
}, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD)
通过这种配置,我得到了一种奇怪的行为,当我尝试调试时,我发现我尝试测试的服务bean类方法无法找到我使用
@sql
中的sql脚本插入的记录,即。
myRepo.findAll()
在方法中获取一个空列表

测试方法的传播选项更改为后,我成功运行了测试:

@Transactional(传播=传播。从不)

或:

@Transactional(传播=传播.支持)

服务类中的方法可以正确地从DB中找到所有记录,但缺点是我必须在测试后通过脚本手动删除这些插入的记录

我已经阅读了关于传播选项的Spring文档,但仍然很困惑


有人能给我解释一下问题的原因吗?为什么更改传播选项后一切都能正常工作?

在测试运行时,默认情况下,如果使用注释@Trasactional,它会创建一个事务T1,并且您的服务方法会根据REQUIRE\u NEW创建另一个事务T2,因为T1尚未提交util test over,T2无法看到尚未提交的数据。但是如果测试没有@Transactional,或者从不创建事务,或者不支持事务,那么它将不会创建事务,但是sql是由jdbcTemplate.execute()执行的,它将在execute()返回后立即创建T1并提交。因此,服务方法能够看到数据。

在测试运行时,默认情况下,如果使用注释@Trasactional,它会创建一个事务T1,并且您的服务方法会根据REQUIRE\u NEW创建另一个事务T2,因为T1尚未提交util测试,T2无法看到尚未提交的数据。但是如果测试没有@Transactional,或者从不创建事务,或者不支持事务,那么它将不会创建事务,但是sql是由jdbcTemplate.execute()执行的,它将在execute()返回后立即创建T1并提交。因此service method可以查看数据。

您已经阅读了相应的文档了吗?是的,我读过,但我不明白为什么我在测试中会看到这种行为。你读过相应的文档了吗?是的,我读过,但我不明白为什么我在测试中会看到这种行为。