【问题标题】:jpa save entities in order, but query errorjpa按顺序保存实体,但查询错误
【发布时间】:2021-08-18 13:31:03
【问题描述】:

在我的SpringBoot项目中,我循环保存了三个实体A、B、C。like:

for (i = 0; i < nums; i++) {
    AService.save(Ai);
    BService.save(Bi);
    CService.save(Ci);
}

而在AService,BService,Cservice中,它们直接调用了ARepository的save方法,属于crudRepository。我在 ARepository 上添加 @Transactional 注释:

public class AService {
    public save(A a) {
        ARepository.save(A);
    }
}

@Repository
@Transactional
public interface ARepository {}

从逻辑上讲,我按顺序保存 A、B、C,它们不应该按顺序保存在数据库中吗? 问题是我有另一个定时任务,它将加入表 A、B、C 来查询数据。而且我发现有时B存在但A没有找到......它很少发生但会导致大问题。为什么? 我使用 Jpa + Posgresql。

【问题讨论】:

    标签: java spring-boot hibernate jpa transactions


    【解决方案1】:

    整个循环应该包含在@Transactional 方法中。如果您为每个对象启动一个新事务,您的数据库将很难写入磁盘。

    【讨论】:

    • 但是不应该完成写入磁盘并且事务完成然后方法返回吗?你的意思是我的代码提交事务并返回但数据库没有写入磁盘?
    • 我的意思是每次事务提交都必须保证在将控制权返回给您的代码之前将数据写入磁盘,因此数据库不能以这种方式捆绑多个更改。如果您在事务中合并一些插入,您会看到更好的性能,因为数据库写入磁盘的粒度是基于页面大小的。
    猜你喜欢
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多