> Что такое дедлоки? (PHP)

Уровень: junior · Роль: backend · Язык: PHP · Категория: Технические вопросы

Компании: vanta

Стек: PHP

> Пример ответа

Дедлок (взаимная блокировка, deadlock) - это ситуация в многопоточном или многопроцессном приложении, когда два или более потока (или процесса) ожидают освобождения ресурсов, удерживаемых друг другом, и ни один из них не может продолжить выполнение.

В PHP дедлоки чаще всего возникают при работе с базами данных (например, MySQL/InnoDB) или при использовании блокировок файлов (flock). Типичный сценарий: транзакция A блокирует строку 1 и ждет строку 2, а транзакция B блокирует строку 2 и ждет строку 1. В результате обе транзакции зависают, пока СУБД не обнаружит цикл и не принудительно прервет одну из них (обычно с ошибкой Deadlock found when trying to get lock).

Пример на PHP с блокировками файлов:

PHP
$file1 = fopen('lock1.txt', 'w');
$file2 = fopen('lock2.txt', 'w');
// Поток 1
flock($file1, LOCK_EX);
sleep(1); // имитация работы
flock($file2, LOCK_EX); // ожидает, пока Поток 2 отпустит lock2
// Поток 2 (выполняется параллельно)
flock($file2, LOCK_EX);
sleep(1);
flock($file1, LOCK_EX); // ожидает, пока Поток 1 отпустит lock1

Оба потока блокируются навсегда - это дедлок.

Для предотвращения дедлоков в PHP рекомендуется:

  • Всегда блокировать ресурсы в одном и том же порядке (например, по алфавиту имен таблиц или файлов).
  • Использовать таймауты для блокировок (например, flock($file, LOCK_EX | LOCK_NB) с повторными попытками).
  • В базах данных - минимизировать длительность транзакций, использовать индексы для снижения числа блокируемых строк, а также обрабатывать исключения PDOException с кодом 1213 (deadlock) и повторять транзакцию.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью