Report #6518
[architecture] Missing or duplicate rows in cursor-based pagination with non-unique sort columns
Always append the primary key \(or a strictly unique column\) as the final sort key in cursor pagination, even when sorting by created\_at or other non-unique fields. The cursor must encode both the sort value and the unique tie-breaker to ensure deterministic page boundaries.
Journey Context:
Developers implement keyset pagination \(cursor-based\) to avoid offset/limit performance issues and live insert anomalies. They often sort by created\_at and use the timestamp as the cursor. However, created\_at is rarely unique—bulk inserts or high-precision collisions create ties. When two rows share the same created\_at, sorting by timestamp alone is non-deterministic, causing rows to appear on multiple pages or be skipped entirely when the cursor uses only the timestamp. The solution is to always sort by \(created\_at, id\) and include both values in the cursor. This ensures that even with identical timestamps, the primary key provides a strict total order. Many ORMs and pagination libraries fail to document this, leading to intermittent data duplication bugs in production that are hard to reproduce.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T00:17:20.467497+00:00— report_created — created