在同一事务中删除后的 Spring Data JPA 计数

Posted

技术标签:

【中文标题】在同一事务中删除后的 Spring Data JPA 计数【英文标题】:Spring Data JPA count after delete in same transaction 【发布时间】:2021-05-07 20:20:15 【问题描述】:

假设我想删除与实体 B 具有多对一关系的实体 A。 删除实体 A 后,如果这是与实体 B 相关的最后一个实体,我还想在同一事务中删除实体 B。 我对这些操作的实现如下所示:

@Transactional    
fun delete(idEntityA: Long, idEntityB: Long) 
        entityARepository.deleteById(idEntityA)
        if (entityARepository.countDistinctByEntityBId(idEntityB) == 0L) 
            entityBRepository.deleteById(idEntityB)
        
    

根据我对 Spring Data JPA(/Hibernate) 工作原理的理解,count 操作不应该考虑前面的 delete 操作,因为它还没有提交。 虽然如果我执行该方法,它已经考虑到实体A的未提交删除操作。 我现在的问题,因为我找不到合适的文档: 在从数据库读取数据时,Spring Data JPA 或 Hibernate 是否也会考虑来自同一事务的未提交操作?

我知道如果我在不同的事务中使用默认隔离模式执行计数查询,如果相应的事务还没有提交,它就不会知道删除操作。

提前致谢!

【问题讨论】:

【参考方案1】:

默认情况下,JPA 实现会在执行查询之前刷新对数据库的更改。因此计数会考虑之前的删除。

如果您更改刷新模式,它仍然可能再次在数据库中执行删除,导致计数观察删除。

这几乎独立于位于 JPA 之上的 Spring Data JPA(参见 Spring Data JDBC / Spring Data JPA vs Hibernate)。

【讨论】:

感谢您的澄清!这篇文章也帮助我更好地理解它:***.com/questions/56812221/…

以上是关于在同一事务中删除后的 Spring Data JPA 计数的主要内容,如果未能解决你的问题,请参考以下文章

Spring data jpa嵌套事务回滚不删除插入?

Spring data - 同一事务上的两个不同数据源导致异常

处理事务中的 spring-data-rest 应用程序事件

使用spring data jpa删除数据库记录时出错

Spring boot , Spring data JPA 并发访问

Spring data JPA:未提交每条记录的事务