Что PostgreSQL делает здесь, описано в документации по Явная блокировка . Пример в разделе «Deadlocks» показывает, что вы, вероятно, делаете. Часть, которую вы, возможно, не ожидали, заключается в том, что когда вы ОБНОВЛЯЕТЕ что-то, это блокирует эту строку, которая продолжается до завершения транзакции. Если у вас есть несколько клиентов, каждый из которых выполняет обновления более чем одной вещи одновременно, вы неизбежно получите тупики, если не сделаете все возможное, чтобы предотвратить их.
Если у вас есть несколько вещей, которые снимают неявные блокировки, такие как UPDATE, вы должны обернуть всю последовательность в блоки транзакций BEGIN / COMMIT и убедиться, что вы согласны с порядком получения блокировок (даже неявных, таких как UPDATE). хватает) везде. Если вам нужно что-то обновить в таблице A, затем в таблице B, и одна часть приложения выполняет A, а затем B, а другая - B, а затем A, вы однажды зашли в тупик. Два ОБНОВЛЕНИЯ для одной и той же таблицы также обречены на неудачу, если только вы не можете принудительно установить порядок их повторения среди клиентов. Сортировка по первичному ключу, когда у вас есть набор записей для обновления, и всегда сначала выбирается «нижний» ключ - это общая стратегия.
Меньше вероятность, что здесь виноваты ваши INSERT, гораздо сложнее попасть в тупиковую ситуацию, если только вы не нарушите первичный ключ, как уже описал Ants.
То, что вы не хотите делать, это пытаться дублировать блокировку в вашем приложении, что превратится в гигантский беспорядок масштабируемости и надежности (и, вероятно, все равно приведет к взаимным блокировкам базы данных). Если вы не можете обойти это в рамках стандартных методов блокировки базы данных, рассмотрите возможность использования либо консультативной функции блокировки, либо явного LOCK TABLE , чтобы применить то, что вам нужно. Это избавит вас от мучительного кодирования, если вы попытаетесь перенести все блокировки на клиентскую сторону. Если у вас есть несколько обновлений для таблицы и вы не можете установить порядок, в котором они происходят, у вас нет другого выбора, кроме как заблокировать всю таблицу во время их выполнения; это единственный маршрут, который не может привести к тупику.