Вопрос или проблема
Я получаю следующую ошибку в error_log. Пожалуйста, помогите мне. Заранее спасибо.
Ошибка базы данных WordPress: Обнаружен взаимный блок; попытка перезапустить транзакцию для запроса
UPDATE asrcxjizj_actionscheduler_actions SET claim_id=1438861, last_attempt_gmt="2024-09-19 14:28:37", last_attempt_local="2024-09-19 09:28:37" WHERE claim_id = 0 AND scheduled_date_gmt <= '2024-09-19 14:28:37' AND status="pending" AND group_id IN ( 3 ) ORDER BY priority ASC, attempts ASC, scheduled_date_gmt ASC, action_id ASC LIMIT 25
создано с помощью
do_action_ref_array('action_scheduler_run_queue_rucss'),
WP_Hook->do_action, WP_Hook->apply_filters,
WP_Rocket\Engine\Common\Queue\RUCSSQueueRunner->run,
WP_Rocket\Engine\Common\Queue\RUCSSQueueRunner->do_batch,
ActionScheduler_DBStore->stake_claim,
ActionScheduler_DBStore->claim_actions
Ответ или решение
Ошибка "Deadlock found when trying to get lock" в базе данных WordPress обычно указывает на проблему взаимной блокировки, возникающую при одновременном обращении нескольких процессов к одной и той же таблице. Это может привести к сбоям в транзакции, и система не может выполнить запрос, как в вашем случае с таблицей asrcxjizj_actionscheduler_actions
. Вот несколько шагов, которые помогут решить вашу проблему:
1. Обновление плагинов и тем
Убедитесь, что все ваши плагины, темы и сама установка WordPress обновлены до последних версий. Неправильные или устаревшие версии могут содержать ошибки, которые могут вызывать конкурирующие транзакции к базе данных.
2. Оптимизация запросов
Ошибка может возникать, если множество запросов к таблице actionscheduler_actions
выполняются одновременно. Возможно, стоит рассмотреть оптимизацию этих запросов:
- Убедитесь, что все необходимые таблицы индексированы. Для таблицы
asrcxjizj_actionscheduler_actions
разумно добавить индексы на поляstatus
,scheduled_date_gmt
иgroup_id
. Это поможет ускорить выполнение запросов и уменьшить вероятность блокировок.
3. Увеличение тайм-аутов
Настройки базы данных могут влиять на уровень конкуренции. Попробуйте увеличить параметры, связанные с блокировками, в конфигурационном файле вашей базы данных (например, my.cnf
для MySQL):
innodb_lock_wait_timeout = 50
4. Настройка количества обрабатываемых задач
Если вы используете плагин, который обрабатывает задачи по расписанию (как в вашем случае с WP Rocket и Action Scheduler), возможно, вам стоит ограничить количество одновременно выполняемых задач:
- В файле
wp-config.php
добавьте следующую строку:
define('AS_ACTIONS_PER_CYCLE', 5); // или меньшее число
5. Обработка ошибок
Вы также можете улучшить обработку ошибок для запросов к базе данных. Это поможет вашему приложению зафиксировать состояние и избежать повторных попыток выполнения заблокированных операций:
- Внедрите повторные попытки для запросов, которые могут вызвать взаимные блокировки, с увеличением времени ожидания.
6. Логирование для анализа
Добавьте логирование каждого запроса и времени его выполнения. Это позволит вам увидеть, какие операции вызывают взаимные блокировки, и оптимизировать их.
7. Проверка состояния сервера
Иногда проблемы с блокировками могут возникнуть из-за производительности самого сервера. Проверьте загрузку сервера и наличие ресурсов. Убедитесь, что у вас достаточные ресурсы для работы базы данных.
Заключение
Следуя указанным рекомендациям, вы сможете уменьшить вероятность возникновения взаимных блокировок и улучшить производительность вашей WordPress установки. Помните, что анализ причин возникновения подобных ошибок и их устранение — это процесс, который может потребовать времени и тестирования различных решений.