I want to implement stable pagination using Postgres database as a backend. By stable, I mean if I re-read a page using some pagination token, the results should be identical.
Using insertion timestamps will not work, because clock synchronization errors can make pagination unstable.
I was considering using pg_export_snapshot() as a pagination token. That way, I can reuse it on every read, and the database would guarantee me the same results since I am always using the same snapshot. But the documentation says that
"The snapshot is available for import only until the end of the transaction that exported it."
(https://www.postgresql.org/docs/9.4/functions-admin.html)
Is there any workaround for this? Is there an alternate way to export the snapshot even after the transaction is closed?
Stable pagination using Postgres
955 Views Asked by RohitG At
1
There are 1 best solutions below
Related Questions in POSTGRESQL
- Only the first SQL script gets executed inside Docker Postgres container
- Compare fields in two tables
- Hibernate ClobJdbcType bindings: what are the diferences?
- Postgres && statement Error in Mybatis Mapper?
- Can this query be optimized? (Choosing a random row to insert, that excludes previously inserted Rows)
- Connection terminated unexpectedly while performing multi row insert using pg-promise
- Processing multiple forms in nodejs and postgresql
- How to copy data from SQLite to postgreSQL?
- PGAdmin4 configured behind a reverse proxy but unable to connect to Postgresql server
- Updates to pgsodium encrypted values don't use specified key_id
- Connecting to Postgres running in a Docker container using psql
- Can't connect to local postgresql server from my docker container
- Django Arrayfield migration to cloud sql (Postgresql) not creating the column
- Get list of matching keywords for each post
- docker-compose can't reset postgresql database
Related Questions in PAGINATION
- In Datatables, start value resets to 0, when column sorting
- React Query infinite scroll pagination resets to first page
- How to implement pagination on the custom dropdown item's in flutter
- How to modify HTML in WordPress core file
- CakePHP 4 Custom Routing Issue with Paginator Links
- How to set up the link for the paginated files in the Get Rows(V2) Logic App connector and pass it via Azure API call?
- Paging 3 Library with Jetpack Compose Not calling the load method after initial load
- Customising Mui pagination to dots instead of numbers
- Performance degradation in Asynchronous paging
- PrimeNg paginator wont display "Entries per page" or Showing entries per page
- WordPress Pagination not working Properly with Custom Post Type
- Is it possible to programmatically access rows from different pages within a TablePress table that utilizes pagination?
- Pagination does not work in Apollo React Native
- Vue 3 component not rendering on the page
- pagination node.js mongoose express, am I doing it wrong?
Related Questions in MVCC
- Is there a way to "revive" a dead tuple in postgres?
- Questions about how MVCC dealing with multiple rows
- Nvidia NVML undefined symbol: nvmlDeviceGetComputeRunningProcesses_v3
- A call to a VOLATILE function breaks atomicity of a SELECT statement
- Run two select statements on the same isolated table snapshot in Snowflake
- Write skew in a snapshot isolation level
- serializable snapshot isolation outdated premise detection
- Which isolation levels use MVCC in MySQL?
- Is it really safe that running `UPDATE t SET v=v-1 WHERE id= ? and v>0` without pessimistic row locking? (MySQL/Postgres/Oracle)
- why plain select has Lock_time?
- MySQL ReadView bug?
- What does ANALYZE do when used within a transaction?
- How to simulate "multi-versioning" regarding database MVCC in JavaScript?
- Relpages and reltuples under MVCC
- Debugging with postgresql transactions state
Trending Questions
- UIImageView Frame Doesn't Reflect Constraints
- Is it possible to use adb commands to click on a view by finding its ID?
- How to create a new web character symbol recognizable by html/javascript?
- Why isn't my CSS3 animation smooth in Google Chrome (but very smooth on other browsers)?
- Heap Gives Page Fault
- Connect ffmpeg to Visual Studio 2008
- Both Object- and ValueAnimator jumps when Duration is set above API LvL 24
- How to avoid default initialization of objects in std::vector?
- second argument of the command line arguments in a format other than char** argv or char* argv[]
- How to improve efficiency of algorithm which generates next lexicographic permutation?
- Navigating to the another actvity app getting crash in android
- How to read the particular message format in android and store in sqlite database?
- Resetting inventory status after order is cancelled
- Efficiently compute powers of X in SSE/AVX
- Insert into an external database using ajax and php : POST 500 (Internal Server Error)
Popular # Hahtags
Popular Questions
- How do I undo the most recent local commits in Git?
- How can I remove a specific item from an array in JavaScript?
- How do I delete a Git branch locally and remotely?
- Find all files containing a specific text (string) on Linux?
- How do I revert a Git repository to a previous commit?
- How do I create an HTML button that acts like a link?
- How do I check out a remote Git branch?
- How do I force "git pull" to overwrite local files?
- How do I list all files of a directory?
- How to check whether a string contains a substring in JavaScript?
- How do I redirect to another webpage?
- How can I iterate over rows in a Pandas DataFrame?
- How do I convert a String to an int in Java?
- Does Python have a string 'contains' substring method?
- How do I check if a string contains a specific word?
You wouldn't need to export snapshots; all you need is a
REPEATABLE READ READ ONLYtransaction so that the same snapshot is used for the whole transaction. But, as you say, that is a bad idea, because long transactions are quite problematic.Using insert timestamps I see no real problem for insert-only tables, but rows that get deleted or updated will certainly vanish or move unless you use “soft delete and update” and leave the old values in the table (which gives you the problem of how to get rid of the values eventually). That would be re-implementing PostgreSQL's multiversioning on the application level and doesn't look very appealing.
Perhaps you could use a scrollable
WITH HOLDcursor. Then the database server will materialize the result set when the selecting transaction is committed, and you can fetch forward and backward at your leisure. Sure, that will hog server resources, but you will have to pay somewhere. Just don't forget to close the cursor when you are done.If you prefer to conserve server resources, the obvious alternative would be to fetch the whole result set to the client and implement pagination on the client side alone.