Escalonamento de bloqueios (lock escalation)
O banco troca milhares de bloqueios de linha por um único bloqueio de tabela para economizar memória — e acaba com a concorrência de uma só vez.
Todo bloqueio custa memória para ser rastreado. Quando uma transação acumula bloqueios de granularidade fina em quantidade suficiente, alguns bancos os descartam e tomam um bloqueio grosso sobre a tabela inteira. O SQL Server faz isso por volta de 5.000 bloqueios num mesmo objeto. A contabilidade fica barata, mas o efeito sobre todas as outras transações é imediato.
O sintoma é característico: um job roda bem até cruzar certo volume de dados, e aí a concorrência desaba e os timeouts se espalham. A solução é dividir grandes alterações em lotes menores, não desativar o escalonamento. O Postgres não tem o mecanismo — com o MVCC, leitores nunca são bloqueados por escritores, então a pressão para economizar memória de bloqueios não surge da mesma forma.