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; — Атомарный счётчик? — Именно.
DBA смотрит на лог: «Deadlock detected». — Кого убили? — Два UPDATE-а. Один держал стул, второй — стол. Никто не уступил. Пришлось убить обоих.
— Что такое index bloat? — Индекс «раздувается» со временем из-за мёртвых версий строк. — Как проверить? — pgstattuple расширение: SELECT * FROM pgstatindex('idx_name'); — Как исправить? — REINDEX CONCURRENTLY idx_name; — перестраивает без блокировки. — VACUUM не помогает? — Помогает частично. Тяжёлый bloat — REINDEX.