通过 JdbcTemplate 执行的查询未回滚,即使通过 CrudRepository 执行的查询

Query executed via JdbcTemplate not rolled back, even though via CrudRepository it is

提问人:Bruno 提问时间:10/6/2023 更新时间:10/6/2023 访问量:15

问:

我有一个Spring Boot项目,其中包含一个测试用例,该测试用例在服务上调用公共方法。该方法被注释,它应该删除具有给定 id 的实体,之后它会抛出 RuntimeException 以诱导回滚。deleteEntity(Long id)@Transactional

如果我使用 实现,则会发生回滚(日志确认这一点),但它没有反映在我的数据库中。如果我使用 实现它,它可以正常工作。deleteEntity(Long id)JdbcTemplateCrudRepository

这是在测试用例中调用的服务的代码(代码被注释掉):JdbcTemplate

@Service
public class TransactionalAPI {

    @Autowired
    private JdbcTemplate template;

    @Autowired
    private QueueEntryDAO dao;

    @Transactional
    public void deleteEntity(Long entryID) {
        dao.deleteById(entryID);
        throw new RuntimeException("Fake exception for testing purposes.");
//        int rows = template.update(String.format("DELETE FROM MYSCHEMA.BATCH_QUEUE WHERE ID = %d", entryID));
//        System.out.printf("Deleted %d rows.", rows);
//        throw new RuntimeException("Fake exception for testing purposes.");
    }

}

我的数据库是 IBM DB2 数据库。创建一个最小的工作示例可能很有用,但它是内部代码,而且我没有数据库的管理员访问权限。这就是为什么我写了这个测试用例作为替代品(我试图解决的真正问题是我正在尝试清理 Spring Batch 表,但我在使该代码成为事务性代码时遇到了问题)。

我查看了内部结构,试图找出与实体相比的差异,它告诉实体管理器删除实体,但代码非常复杂,因此很难比较。知道这里会发生什么吗?SimpleJPARepositoryJdbcTemplate

spring-boot db2 jdbctemplate 回滚 crud-repository

评论


答: 暂无答案