Failure pattern · 2 documented incidents
Partial success leaves systems out of sync
A multi-step workflow half-completes, or events arrive out of order, and two systems now disagree about what happened.
See it happen
Watch how this failure unfolds, then switch to the same situation with the safeguard in place. Click any step to replay it.
Scroll the diagram sideways to see every system.
The customer has paid, but no order exists. The systems disagree.
What goes wrong:
- Checkout charges the customer’s card.
- Reserving the item fails halfway through.
- The workflow stops, and nothing undoes the charge.
- The customer has paid, but no order exists. The systems disagree.
With the safeguard:
- Checkout charges the customer’s card.
- Reserving the item fails halfway through.
- Every step has an undo: the workflow refunds the charge automatically.
- A reconciler compares the systems on a schedule and flags any gap.
What it is
A process with several steps gets halfway: the card is charged but the item isn’t reserved, or one database accepted a write the other never saw. Now two systems disagree about what happened, and nobody notices until a customer does.
How it happens
- One business action spans several services or databases
- A later step fails and nothing undoes the earlier ones
- Events can arrive late, twice or out of order
What it causes
- Customers charged for orders that don’t exist
- Records that contradict each other between systems
- Manual cleanup that takes days
Warning signs
- Mismatches between your records and a partner’s
- Workflows stuck in an in-between state
- Support tickets about paying without receiving
How to prevent it
Design multi-step workflows to converge. Use an outbox or saga with compensating steps, order and version events so stale ones are ignored, and reconcile against the system of record on a schedule.
- Every step in a multi-step workflow has a matching undo that runs if a later step fails
- Events carry versions or timestamps, so stale ones are ignored
- A scheduled job reconciles the systems and flags any disagreement
Key ideas:Reconciliation
Check your system against the full launch checklistReal incidents with this pattern
Documented incidents first. Each links to its public source.
Confusing loan-system interface leads Citibank to wire nearly $900 million in principal to Revlon lenders (2020)
Unintuitive Flexcube interface required checking obscure override box; bank accidentally wired $894M of proprietary funds to Revlon lenders.
Safeguard: Design payment interfaces so a risky option is explicit
43-second network partition triggers database failover and unreplicated writes (GitHub, 2018)
Network maintenance caused a 43-second loss of connectivity between GitHub's US East Coast hub and its primary data center, which led to 24 hours and 11 minutes of degraded service.
Safeguard: Make automatic failover aware of replication state
9 security advisories and illustrative scenarios with this pattern
Real-Time Message Cache Inconsistency During Large Redis Cluster Migration
Migrating message caches between Redis clusters caused race conditions and state drift between cache and Cassandra persistence layer.
Network Partition Database Failover Connection Pool Starvation
Network partition during database maintenance triggered simultaneous split-brain failovers, causing connection pool exhaustion on all API gateways.
Viral Flash Sale Checkout Write Lock Amplification & Database Contention
Synchronized row-level inventory locks on viral merchant flash sales saturated database thread pools, causing cascading timeouts on unrelated stores.
Distributed Consensus Split-Brain State Divergence
Asymmetric network partition caused two leader nodes to accept client writes simultaneously, corrupting ledger state.
Serverless Function Cold Start Connection Pool Exhaustion
Spike in concurrent lambda invocations opened 10,000 direct PostgreSQL connections, crashing primary RDS instance.
Payment Webhook Out-of-Order Delivery State Machine Corruption
Late-arriving paymentfailed webhook processed after subscriptionrenewed, deactivating active paying customer account.
Kafka Consumer Group Rebalance Storm Message Lag
Slow consumer heartbeat during heavy batch processing triggered infinite rebalance loop, halting all event consumption.
OAuth Refresh Token Reuse Race Condition & Account Takeover
Simultaneous token refresh requests from multi-tab sessions triggered false reuse detection, locking user accounts.
WebSocket Connection Thundering Herd on Load Balancer Restart
Simultaneous disconnect of 500,000 active WebSocket clients during proxy restart saturated auth services upon reconnection.
In the standards
CollectSEA's mapping; not an official determination by the standards bodies.