Вопрос проверяет опыт работы с конкурентными транзакциями и понимание причин взаимных блокировок.
Дедлок — это ситуация, когда транзакции блокируют друг друга и не могут продолжить выполнение. База данных обнаруживает дедлок и откатывает одну из транзакций. Такое может происходить при неправильном порядке обновления данных. Проблема решается упорядочиванием операций и корректной архитектурой.
Дедлоки — нормальное явление в системах с параллельной записью, но их нужно уметь предотвращать.
Определение:
Дедлок — это ситуация, когда две или более транзакции навсегда ждут освобождения ресурсов друг от друга.
Транзакция A:
UPDATE users SET name = 'A' WHERE id = 1;
-- ждёт блокировку id = 2
Транзакция B:
UPDATE users SET name = 'B' WHERE id = 2;
-- ждёт блокировку id = 1
Обнаруживает цикл ожидания
Прерывает одну транзакцию
Выбрасывает ошибку дедлока
Всегда обновлять данные в одном порядке
Делать транзакции короткими
Избегать лишних блокировок
Использовать подходящие индексы
Обрабатывать ошибку дедлока
Делать ретраи
Логировать проблемные места
Дедлоки возникают из-за конкуренции за ресурсы. Их можно минимизировать правильным порядком операций и короткими транзакциями, а на уровне кода — обрабатывать и повторять операции.