0

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

4

1 回答 1

2

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

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

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

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

于 2020-09-15T02:20:57.570 回答