У нас есть скрипт, который запускается в 5:15 утра и извлекает данные с 36 удаленных сайтов. Отдельный экземпляр скрипта запускается для каждого сайта, поэтому все 36 запускаются одновременно. Диапазон данных от 400 КБ до 1 МБ.
Когда данные поступают с удаленного сайта, скрипт пытается удалить строки с той же датой и идентификатором сайта в нашей базе данных MySQL, а затем вставить новые данные. Мы часто получаем эту ошибку:
Превышено время ожидания блокировки; попробуйте перезапустить транзакцию mysql
когда он пытается удалить старые строки. Иногда скрипт просто перестает отвечать без сообщения об ошибке.
Означает ли ошибка, что она не может удалить или вставить данные, потому что таблица заблокирована?
Как мы можем это исправить?
Есть ли способ создать очередь SQL для удаления / вставки и ждать, пока таблица не станет разблокированной?
У нас есть много других скриптов, которые вставляют данные со всех 36 сайтов, но у нас есть эта ошибка только с двумя нашими скриптами. Эти 2 сценария возвращают гораздо больше данных, чем любой другой сценарий.
Это не совсем тот ответ, на который я надеялся, но у меня есть обходной путь. Когда PHP пытается удалить / вставить данные в MySQL, он проверяет возвращаемое значение, чтобы увидеть, были ли какие-либо ошибки. Если он обнаружит ошибку ожидания блокировки, он попытается вставить данные на срок до 10 минут. С тех пор как это изменение было сделано, оно, похоже, устранило проблему. Кстати, мы используем PDO для всего.
Других решений пока нет …