Получение «Превышено время ожидания блокировки; попробуйте перезапустить транзакцию», даже если я не использую транзакцию - PullRequest
217 голосов
/ 29 апреля 2011

Я выполняю следующую инструкцию MySQL UPDATE:

mysql> update customer set account_import_id = 1;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

Я не использую транзакцию, так почему я получаю эту ошибку?Я даже попытался перезапустить свой сервер MySQL, но это не помогло.

В таблице 406 733 строки.

Ответы [ 17 ]

0 голосов
/ 25 марта 2019

Я столкнулся с этим, имея 2 соединения Doctrine DBAL, одно из которых как нетранзакционные (для важных журналов), они предназначены для параллельной работы независимо друг от друга.

CodeExecution(
    TransactionConnectionQuery()
    TransactionlessConnectionQuery()
)

Мои тесты интеграции были свернуты в транзакции для отката данных после самого теста.

beginTransaction()
CodeExecution(
    TransactionConnectionQuery()
    TransactionlessConnectionQuery() // CONFLICT
)
rollBack()

Моим решением было отключить транзакцию обертывания в этих тестах и ​​сбросить данные БД другим способом.

0 голосов
/ 24 января 2019

Если вы только что убили большой запрос, потребуется время до rollback. Если вы выполните другой запрос до того, как завершенный откат будет завершен, вы можете получить ошибку тайм-аута блокировки. Вот что случилось со мной. Решением было просто немного подождать.

подробности:

Я выполнил запрос DELETE, чтобы удалить около 900 000 из примерно 1 миллиона строк.

Я запустил это по ошибке (удаляет только 10% строк): DELETE FROM table WHERE MOD(id,10) = 0

Вместо этого (удаляет 90% строк): DELETE FROM table WHERE MOD(id,10) != 0

Я хотел удалить 90% строк, а не 10%. Поэтому я убил процесс в командной строке MySQL, зная, что он откатит все строки, которые он удалил.

Затем я немедленно выполнил правильную команду и вскоре получил ошибку lock timeout exceeded. Я понял, что блокировка может быть на самом деле rollback уничтоженного запроса, все еще происходящего в фоновом режиме. Поэтому я подождал несколько секунд и повторно запустил запрос.

0 голосов
/ 06 ноября 2018

В моем случае я выполнял ненормальный запрос для исправления данных. Если вы заблокируете таблицы в своем запросе, вам не придется иметь дело с таймаутом блокировки:

LOCK TABLES `customer` WRITE;
update customer set account_import_id = 1;
UNLOCK TABLES;

Вероятно, это не очень хорошая идея для нормального использования.

Подробнее см .: Справочное руководство по MySQL 8.0

0 голосов
/ 15 марта 2018

Если у вас больше ничего не работает и у вас есть собственный экземпляр, я считаю, что было бы эффективнее просто перезапустить mysql

0 голосов
/ 11 сентября 2017

Была такая же ошибка, хотя я обновлял только одну таблицу с одной записью, но после перезапуска mysql она была устранена.

0 голосов
/ 02 декабря 2016

Такого рода вещи произошли со мной, когда я использовал php выход языковой конструкции; в середине транзакции. Тогда это транзакция "зависает", и вам нужно убить процесс mysql (описанный выше с помощью processlist;)

0 голосов
/ 17 апреля 2016

Поздно к вечеринке (как обычно), однако моя проблема заключалась в том, что я написал какой-то плохой SQL (будучи новичком), и у нескольких процессов была блокировка записи (записей) <- не уверен в правильном словесном выражении. Мне пришлось просто: <code>SHOW PROCESSLIST и затем убить идентификаторы, используя KILL <id>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...