Lock escalation
The database trades thousands of row locks for a single table lock to save memory — and wipes out concurrency in one step.
Every lock costs memory to track. Once a transaction has accumulated enough fine-grained row locks, some databases discard them and take a coarse lock on the whole table instead. SQL Server does this at around 5,000 locks on one object. The bookkeeping gets cheap, but the effect on every other transaction is immediate.
The symptom is characteristic: a job runs fine until it crosses a certain data volume, after which concurrency collapses and timeouts spread. The fix is to split large changes into smaller batches, not to disable escalation. Postgres lacks the mechanism entirely — its MVCC means readers are never blocked by writers, so the pressure to save lock memory does not arise the same way.