Deadlock (взаимная блокировка)
Ситуация, когда две транзакции ждут блокировок друг друга и не могут продолжить.
-- Защита от дедлоков: одинаковый порядок блокировок
SELECT * FROM ... WHERE id IN (...) ORDER BY id FOR UPDATE;Объяснение
Пример
-- Безопасная очередь задач
SELECT * FROM tasks
WHERE status = 'pending'
ORDER BY created_at
LIMIT 1
FOR UPDATE SKIP LOCKED;Связанные термины
Анекдоты по теме
— Что такое two-phase commit? — Протокол для распределённых транзакций через несколько баз. — Фазы? — 1: все участники готовятся и говорят «готов». — 2: если все готовы — все фиксируют. Иначе — все откатывают. — Надёжно? — Да, но медленно. Один slow participant тормозит всех.
— Что такое HOT update в PostgreSQL? — Heap Only Tuple. Если обновлённые колонки не входят в индексы — PostgreSQL обновляет строку без изменения индекса. — Это быстрее? — Значительно. Индекс не трогается.
— Что такое advisory locks? — Пользовательские блокировки вне транзакций. — Пример? — SELECT pg_advisory_lock(12345); — захватить блокировку с ID 12345. — Зачем? — Распределённые mutex: только один воркер обрабатывает задачу с ID 12345. — Как Redis SETNX, но в PostgreSQL. — Именно, без Redis.