Я использую Laravel 5.1.
Очереди используются для выборки / синхронизации данных между несколькими системами.
Я использую драйвер базы данных, все время работают 3 процесса "artisan queue: work --daemon".
Задания отправляются как пользователями системы, так и планировщиком (cron). Для определения приоритета заданий используются три очереди.
Кажется, все работает нормально - таблица заданий заполняется записями, система заботится о них и удаляет уже выполненные.
Однако через некоторое время начинают мешать проблемы с блокировкой:
SQLSTATE [40001]: Ошибка сериализации: 1213 Обнаружена тупиковая ситуация при попытке получить блокировку; попробуйте перезапустить транзакцию
а также
«RuntimeException» с сообщением «Невозможно поменять местами экземпляр PDO во время транзакции».
а также
SQLSTATE [HY000]: Общая ошибка: 1205 Превышено время ожидания блокировки; попробуйте перезапустить транзакцию
Я еще не пробовал использовать другой драйвер очереди. Я бы действительно хотел остаться с базой данных. Движок - InnoDB, таблица заданий имеет структуру и индексы по умолчанию.
Есть ли способ решить эту проблему? Что ты думаешь?
Возможно, стоит упомянуть, что я вызываю DB::reconnect()
внутри своих классов заданий, поскольку работники очереди работают как демоны.
Как и следовало ожидать, задания отправляются с использованием признака DispatchesJobs
. Другим способом я не вмешиваюсь в алгоритм очередей.
COMMIT
транзакции как можно скорее. Проверьте использованиеautocommit
. - person Rick James   schedule 12.09.2015