what - транзакция mysql пример




Фиксация «Тайм-аут блокировки ожидания превышен; попробуйте перезапустить транзакцию «за« застрявшую »таблицу Mysql? (8)

Вы можете проверить текущие транзакции с помощью

SELECT * FROM `information_schema`.`innodb_trx` ORDER BY `trx_started`

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

KILL 1234;

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

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

update some_table set some_column = some_value

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

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

Lock wait timeout exceeded; try restarting transaction

Это таблица innodb, поэтому застрявшая транзакция, вероятно, неявная. Как я могу исправить эту таблицу и удалить из нее застрявшую транзакцию?


Исправлено. Убедитесь, что в запросе нет вставки несогласованного типа данных. У меня возникла проблема, когда я пытался «данные агента пользователя браузера» в «VARCHAR (255)» и проблема с этой блокировкой, однако, когда я изменил ее на «ТЕКСТ (255)», она исправила ее. Поэтому, скорее всего, это неправильное соответствие типа данных


Перезагрузите MySQL, он отлично работает.

НО будьте осторожны, если такой запрос застрял, есть проблема где-то:

  • в вашем запросе (неправильный символ, декартовый продукт, ...)
  • очень много записей для редактирования
  • сложные соединения или тесты (MD5, подстроки, LIKE %...% и т. д.)
  • проблема структуры данных
  • модель внешнего ключа (блокировка цепи / петли)
  • неверно проиндексированные данные

Как сказал @syedrakib, это работает, но это не долгоживущее решение для производства.

Остерегайтесь: выполнение перезапуска может повлиять на ваши данные с несогласованным состоянием.

Кроме того, вы можете проверить, как MySQL обрабатывает ваш запрос с помощью ключевого слова EXPLAIN и видит, возможно ли что-то ускорить запрос (индексы, сложные тесты, ...).


Перейти к процессам в mysql.

Таким образом, можно видеть, что еще есть задача.

Убейте конкретный процесс или дождитесь завершения процесса.


У меня возникла эта проблема при попытке удалить определенную группу записей (используя MS Access 2007 с подключением ODBC к MySQL на веб-сервере). Обычно я удаляю определенные записи из MySQL, а затем заменяю обновленные записи (каскад удаляет несколько связанных записей, это упрощает удаление всех связанных записей для удаления одной записи).

Я попытался выполнить операции, доступные в phpMyAdmin для таблицы (оптимизация, флеш и т. Д.), Но я получил разрешение на ошибку RELOAD при попытке сброса. Поскольку моя база данных находится на веб-сервере, я не мог перезапустить базу данных. Восстановление из резервной копии не было вариантом.

Я попытался выполнить запрос удаления для этой группы записей в доступе cPanel mySQL в Интернете. Получено такое же сообщение об ошибке.

Мое решение: я использовал бесплатный MySQL MySQL Query Browser (который ранее был установлен на моем компьютере) и запускал там запрос на удаление. Это сработало сразу, проблема решена. Затем я смог снова выполнить функцию, используя скрипт Access, используя соединение ODBC Access to MySQL.


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

Правда, есть, вероятно, какой-то способ оптимизировать ваши запросы или вашу БД, но попробуйте эти 2 запроса для исправления работы.

Запустите это:

SET GLOBAL innodb_lock_wait_timeout = 5000; 

И тогда это:

SET innodb_lock_wait_timeout = 5000; 

Я решил проблему, отбросив таблицу и восстановив ее из резервной копии.


Я столкнулся с той же проблемой, что и «обновление». Моим решением было просто выполнить операции, доступные в phpMyAdmin для таблицы. Я оптимизировал, очищал и дефрагментировал таблицу (не в том порядке). Не нужно бросать стол и восстанавливать его из резервной копии для меня. :)





transactions