PDO beginTransaction failure

Я получаю следующую ошибку в php error_log

PHP Предупреждение: ошибка при отправке пакета QUERY. PID = 29770 в /home/test/test.php в строке 87

И на линии 87 в моем php script код id

$DBH->beginTransaction();

И после этого, когда я совершаю, я получаю следующую ошибку

exception "PDOException" с сообщением "Нет активной транзакции" в /home/test/test.php:98

Я уже установил max_allowed_packet=512M, а моя таблица InnoDB

Что здесь не так?

РЕДАКТИРОВАТЬ: Мой код работает в цикле, чтобы вставить всего 100 000 + записей в таблицу. Я делаю 5000 множественных вставок в каждой транзакции. Это моя структура кода

beginTransaction
 Multiple insert query for 5000 records
commit

Запуск в цикле для вставки 100 000 + записей. Иногда script выполняется успешно, иногда он терпит неудачу.

Я получаю эту ошибку в середине 6-7 циклов (после вставки записей 30k в 40k)

Ответы

Ответ 1

Другая возможность - записать данные в CSV файл и использовать MySQL LOAD DATA INFILE для загрузки его в вашу базу данных (здесь ссылка на MySQL документы). Я пробовал это с CSV файлами размером до 250 МБ, и он работал очень хорошо.

Ответ 2

Существует вероятность того, что соединение с базой данных не является постоянным. Это может привести к тому, что транзакции будут уничтожены до совершения и, следовательно, ошибки.

Я бы скорее прокомментировал, поскольку это не "ответ" как таковой, но, к сожалению, у меня нет необходимой репутации.

Ответ 3

Я сделал несколько поисков в Интернете для фразы "Ошибка при отправке пакета QUERY". Он смог включить эту ссылку: http://www.willhallonline.co.uk/blog/max-packet-size-php-error

У автора этой публикации была аналогичная проблема, а также попытался увеличить размер max_allowed_packet и увеличить время ожидания, но это не сработало. Но то, что, похоже, сработало, разбило работу на более мелкие куски.

Наши новые файлы csv меньшего размера, успешно обновленные в MySQL, хотя мы по-прежнему не знаем, что из-за исходной ошибки.

Мне непонятно, обрабатывали ли они много кусков в течение всего одного процесса PHP или если они запускали код несколько раз, но идея кажется звуковой; возможно, вы можете попробовать.