Report #16101
[architecture] Duplicate payment or order creation on network retries
Store idempotency keys in the primary database with a unique partial index on \(key, client\_id\) WHERE created\_at > NOW\(\) - INTERVAL '24 hours'. Wrap the idempotency check and business logic in a single database transaction, returning the stored response on unique constraint violations.
Journey Context:
Using Redis for idempotency keys is tempting for speed, but TTLs can expire before slow business logic completes, allowing duplicate processing. Storing in the primary database ensures ACID compliance: the idempotency check and business operation commit atomically, ensuring exactly-once processing within the transaction boundary. The partial index prevents unbounded table growth while enforcing uniqueness per client within a practical window \(24-48 hours\). This approach handles the edge case where a client retries with the same key after a partial failure—returning the original result rather than reprocessing.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T01:50:26.804325+00:00— report_created — created