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;Связанные термины
Анекдоты по теме
— Что такое транзакция? — Это обещание базы данных. Либо всё, либо ничего. — Как брак? — Только с гарантированным ROLLBACK при ошибке.
— Что такое DDL транзакции? — В PostgreSQL DDL операции (CREATE, ALTER, DROP) транзакционны. — То есть можно откатить DROP TABLE? — Да! BEGIN; DROP TABLE users; ROLLBACK; — таблица цела. — В MySQL? — DDL делает implicit COMMIT. Откатить нельзя. — Это важное отличие.
— Что такое Hot standby feedback? — Механизм, когда replica сообщает primary какие XID ещё нужны. — Зачем? — Предотвращает отмену запросов на реплике из-за VACUUM на primary. — Без этого? — Длинный запрос на реплике прерывается: 'ERROR: canceling statement due to conflict with recovery'. — Включить: hot_standby_feedback = on в postgresql.conf на replica.