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;Связанные термины
Анекдоты по теме
— Что такое upsert? — INSERT, который превращается в UPDATE при конфликте. — Пример? — INSERT INTO counters (key, value) VALUES ('hits', 1) ON CONFLICT (key) DO UPDATE SET value = counters.value + 1; — Атомарный счётчик? — Именно.
— Что такое Hot standby feedback? — Механизм, когда replica сообщает primary какие XID ещё нужны. — Зачем? — Предотвращает отмену запросов на реплике из-за VACUUM на primary. — Без этого? — Длинный запрос на реплике прерывается: 'ERROR: canceling statement due to conflict with recovery'. — Включить: hot_standby_feedback = on в postgresql.conf на replica.
— Как называется страх перед COMMIT? — Коммитофобия. Симптомы: пальцы дрожат над кнопкой, глаза бегают, в голове «А вдруг ROLLBACK уже нельзя?»