如果在下一个数据库之间操作数据库,页面如何工作

时间:2017-01-11 09:27:37

标签: spring-data

我所拥有的以下代码正在按预期工作,但是有更好的方法吗?

我正在使用像队列一样的数据库,并以最大数量的批量处理。我正在考虑如何重构它以使用page.hasNext()page.nextPageable()

但是,如果在获取页面和获取下一页之间操纵数据库会发生什么,我找不到任何好的教程/文档。

List<Customer> toBeProcessedList = customerToBeProcessedRepo
            .findFirstXAsCustomer(new PageRequest(0, MAX_NR_TO_PROCESS));
while (!toBeProcessedList.isEmpty()) {
    //do something with each customer and
    //remove customer, and it's duplicates from the customersToBeProcessed
    toBeProcessedList = customerToBeProcessedRepo
                .findFirstXAsCustomer(new PageRequest(0, MAX_NR_TO_PROCESS));
}

1 个答案:

答案 0 :(得分:1)

如果对请求的每个页面使用分页支持,则会执行新的sql语句,如果你不做某些花哨的事情(可能是愚蠢的),它们会在不同的事务中执行。当用户从一个页面移动到另一个页面时,这可能导致多次获取元素或者根本看不到它们。

示例:页面大小3;要开始的要素:A,B,C,D,E,F

用户打开第一页并看到

A,B,C(总页数为2)

元素X在B之后插入;用户移动到下一页并看到

C,D,E(现在总页数为3)

如果不是添加X,而是删除C,则第2页将显示

E,F

因为D移动到第一页。

理论上,人们可以拥有一个具有读取稳定性的长时间运行事务(如果底层数据库支持),那么可以获得一致的页面,但这会产生如下问题:

  • 此交易何时结束,以便用户看到新的/已更改的数据

  • 当用户离开时,此交易何时结束?

  • 这种方法会产生一些相当高的资源成本,而实际效益并不明显

因此,在100个案例中的99个中,默认方法非常合理。

脚注:我假设关系型数据库,但其他商店的行为应该基本相同。