Report #68875
[architecture] Offset pagination causes duplicate/missing rows under concurrent writes
Use keyset pagination \(seek method\) with a composite cursor \(last\_seen\_value, primary\_key\) instead of OFFSET; ensure the cursor columns match the ORDER BY exactly, include the primary key as a tie-breaker for non-unique sort columns, and fetch the next page using WHERE \(sort\_col, id\) > \(last\_sort\_val, last\_id\).
Journey Context:
OFFSET pagination is O\(n\) and creates a 'drift' window: if a row is inserted at position 5 while the user fetches page 2 \(offset 10\), the row that was at position 10 shifts to 11 and is skipped, while the previous row at 9 appears again at position 10. Cursor-based pagination anchors to the last seen value, creating a stable snapshot view. The critical mistake is using a single timestamp column as the cursor in high-throughput systems where multiple rows share the same microsecond timestamp \(ties\), causing the cursor to skip rows with identical timestamps. The composite cursor \(timestamp, id\) guarantees uniqueness. Note that this sacrifices 'jump to page 5' navigation; you must accept that only next/previous navigation is possible for consistency.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T22:05:22.626585+00:00— report_created — created