Java 用@Transactional注释的服务方法的Spring引导集成测试(传播=传播。需要\u NEW)
我正在使用Spring Boot并尝试编写一个集成测试,其中调用了一个带注释的方法: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) 通过这种配置
@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可以查看数据。您已经阅读了相应的文档了吗?是的,我读过,但我不明白为什么我在测试中会看到这种行为。你读过相应的文档了吗?是的,我读过,但我不明白为什么我在测试中会看到这种行为。