> Что такое дедлоки? (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');// Поток 1flock($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) и повторять транзакцию.
> Похожие задачи по PHP
Как устроен процесс деплоя и инфраструктура
Какие есть способы оптимизации тяжелых запросов к базе данных
Напишите функцию, которая асинхронно сделает fetch-запрос, распарсит ответ и вернет имя пользователя
Как изменить взаимодействие с внешним сервисом, чтобы избежать увеличения нагрузки из-за ретраев
> Похожие задачи по backend
Какие есть способы оптимизации тяжелых запросов к базе данных
Почему вы сменили PHP на Go, что было мотиватором
Напишите функцию, которая асинхронно сделает fetch-запрос, распарсит ответ и вернет имя пользователя
Как изменить взаимодействие с внешним сервисом, чтобы избежать увеличения нагрузки из-за ретраев
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью