【问题标题】:Stable pagination using Postgres使用 Postgres 进行稳定的分页
【发布时间】:2020-09-14 23:11:10
【问题描述】:

我想使用 Postgres 数据库作为后端来实现稳定的分页。稳定,我的意思是如果我使用一些分页标记重新阅读页面,结果应该是相同的。
使用插入时间戳不起作用,因为时钟同步错误会使分页不稳定。
我正在考虑使用 pg_export_snapshot() 作为分页标记。这样,我可以在每次读取时重用它,并且数据库将保证我得到相同的结果,因为我总是使用相同的快照。但是文档说
“快照只能在导出它的事务结束之前导入。” (https://www.postgresql.org/docs/9.4/functions-admin.html)
有什么解决方法吗?即使在事务关闭后,是否还有其他方法可以导出快照?

【问题讨论】:

    标签: postgresql pagination mvcc


    【解决方案1】:

    您不需要导出快照;您只需要一个REPEATABLE READ READ ONLY 事务,以便为整个事务使用相同的快照。但是,正如你所说,这是一个坏主意,因为长时间的交易是很成问题的。

    使用插入时间戳我认为只插入表没有真正的问题,但是被删除或更新的行肯定会消失或移动,除非您使用“软删除和更新”并将旧值保留在表中(这会给您如何最终摆脱价值观的问题)。那将是在应用程序级别重新实现 PostgreSQL 的多版本控制,并且看起来不太吸引人。

    也许您可以使用可滚动的WITH HOLD 光标。然后数据库服务器将在提交选择事务时具体化结果集,您可以随意向前和向后取回。当然,这会占用服务器资源,但您必须在某个地方付费。完成后不要忘记关闭光标。

    如果您希望节省服务器资源,显而易见的替代方法是将整个结果集获取到客户端并单独在客户端实现分页。

    【讨论】:

      猜你喜欢
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      • 2015-05-05
      • 1970-01-01
      • 2021-03-24
      • 2014-01-23
      相关资源
      最近更新 更多