Report #9616
[architecture] Using OFFSET pagination causes missing or duplicate rows when underlying data changes during pagination
Implement keyset pagination \(cursor-based\) using an immutable, monotonic composite key \(e.g., \`created\_at, id\` with tie-breaker\) and pass the last seen value as a cursor; avoid OFFSET entirely for paginating real-time mutable lists.
Journey Context:
OFFSET is deceptively simple but O\(n\) in performance \(the database must scan and discard all prior rows\). Worse, it creates 'drift': if a row is inserted or deleted on page 1 while the user views page 2, the entire result set shifts, causing the user to see row 10 again as row 11 or skip rows entirely. Cursor pagination is O\(log n\) and stable against concurrent modifications because it anchors to actual data values rather than relative positions. The critical implementation detail is ensuring the sort key is immutable \(use \`id\` as a tie-breaker for non-unique timestamps\) and handling bidirectional navigation \(next/prev cursors require reversing the sort order or using exclusive comparisons\).
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T08:41:16.775125+00:00— report_created — created