Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 使用Postgres的稳定分页_Postgresql_Pagination_Mvcc - Fatal编程技术网

Postgresql 使用Postgres的稳定分页

Postgresql 使用Postgres的稳定分页,postgresql,pagination,mvcc,Postgresql,Pagination,Mvcc,我想使用Postgres数据库作为后端实现稳定的分页。所谓稳定,我的意思是,如果我使用某些分页标记重新读取页面,结果应该是相同的。 使用插入时间戳将不起作用,因为时钟同步错误会使分页不稳定。 我正在考虑使用pg_export_snapshot()作为分页标记。这样,我可以在每次读取时重复使用它,而且数据库将保证我得到相同的结果,因为我总是使用相同的快照。但是文件上说 “只有在导出快照的事务结束之前,快照才可用于导入。” () 有什么解决办法吗?是否有其他方法可以在事务结束后导出快照?您不需要导出

我想使用Postgres数据库作为后端实现稳定的分页。所谓稳定,我的意思是,如果我使用某些分页标记重新读取页面,结果应该是相同的。
使用插入时间戳将不起作用,因为时钟同步错误会使分页不稳定。
我正在考虑使用pg_export_snapshot()作为分页标记。这样,我可以在每次读取时重复使用它,而且数据库将保证我得到相同的结果,因为我总是使用相同的快照。但是文件上说
“只有在导出快照的事务结束之前,快照才可用于导入。” ()

有什么解决办法吗?是否有其他方法可以在事务结束后导出快照?

您不需要导出快照;您所需要的只是一个
可重复只读的
事务,以便整个事务使用相同的快照。但是,正如您所说,这是一个坏主意,因为长时间的事务是相当有问题的

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

也许您可以使用带有HOLD的可滚动
光标。然后,当提交所选事务时,数据库服务器将具体化结果集,您可以随意向前和向后提取。当然,这会占用服务器资源,但您必须在某处付费。完成后别忘了关闭光标


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

您不需要导出快照;您所需要的只是一个
可重复只读的
事务,以便整个事务使用相同的快照。但是,正如您所说,这是一个坏主意,因为长时间的事务是相当有问题的

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

也许您可以使用带有HOLD的可滚动
光标。然后,当提交所选事务时,数据库服务器将具体化结果集,您可以随意向前和向后提取。当然,这会占用服务器资源,但您必须在某处付费。完成后别忘了关闭光标

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