Подтвердить что ты не робот

MySQL: превышено время ожидания блокировки ожидания

Я пытаюсь удалить несколько строк из базы данных MySQL 5.0.45:

delete from bundle_inclusions;

Клиент работает некоторое время, а затем возвращает ошибку:

Lock wait timeout exceeded; try restarting transaction

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

4b9b3361

Ответ 1

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

  • Удалите строки меньшими партиями (например, DELETE FROM bundle_inclusions WHERE id BETWEEN? и?)
  • Если это таблица MyISAM (на самом деле это может работать и с InnoDB), попробуйте сделать ТАЙМУ LOCK перед DELETE. Это должно гарантировать, что у вас есть эксклюзивный доступ.
  • Если это таблица InnoDB, то после истечения таймаута используйте SHOW INNODB STATUS. Это должно дать вам некоторое представление о том, почему не удалось получить блокировку.
  • Если у вас есть привилегия SUPER, вы можете попробовать SHOW PROCESSLIST ALL, чтобы узнать, какие другие соединения (если есть) используют таблицу, а затем используйте KILL, чтобы избавиться от той, с которой вы конкурируете.

Я уверен, что есть много других возможностей; Я надеюсь, что одна из них поможет.

Ответ 2

Linux: в конфигурации mysql (/etc/my.cnf или /etc/mysql/my.cnf) вставьте/отредактируйте эту строку

innodb_lock_wait_timeout = 50

Увеличить значение (в секундах), перезапустить базу данных, выполнить изменения. Затем верните изменения и снова перезапустите.

Ответ 3

Угадывание: усечение таблицы bundle_inclusions

Ответ 4

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