Как разрешить превышение ожидания ожидания блокировки & lt; ldquo; 1205 & rdquo; вопрос в двигателе INNODB [дубликат]

Есть некоторые тонкие отличия - let scoping ведет себя больше, как изменение переменных, в более или менее любых других языках.

, например. Он привязан к закрывающему блоку. Они не существуют до их объявления и т. Д.

Однако стоит отметить, что let является лишь частью новых реализаций Javascript и имеет разную степень поддержка браузера .

166
задан shgnInc 17 June 2015 в 07:03
поделиться

13 ответов

Вы используете транзакцию; autocommit не отключает транзакции, он просто заставляет их автоматически фиксировать в конце инструкции.

Что происходит, в каком-то другом потоке сохраняется запись на какой-либо записи (вы обновляете каждую запись в таблицу!) слишком долго, и ваш поток истекает.

Вы можете увидеть более подробную информацию о событии, выпустив

SHOW ENGINE INNODB STATUS\G 

после события. В идеале это делается на тихой тестовой машине.

143
ответ дан Chris Seymour 27 August 2018 в 20:21
поделиться

Убедитесь, что таблицы базы данных используют механизм хранения InnoDB и уровень изоляции транзакций READ-COMMITTED.

Вы можете проверить это с помощью SELECT @@ GLOBAL.tx_isolation, @@ tx_isolation; на консоли mysql.

Если он не установлен для READ-COMMITTED, вы должны его установить. Перед установкой убедитесь, что у вас есть привилегии SUPER в mysql.

Вы можете воспользоваться справкой из http://dev.mysql.com/doc/refman/5.0/en/set-transaction. html .

Установив это, я думаю, ваша проблема будет решена.


Вы также можете проверить, что вы не пытаетесь обновить это в два процесса одновременно. Пользователи (@tala) столкнулись с подобными сообщениями об ошибках в этом контексте, возможно, дважды проверьте, что ...

1
ответ дан 2 revs, 2 users 93% 27 August 2018 в 20:21
поделиться

Ни один из предлагаемых решений не работал для меня, но это делалось.

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

SHOW PROCESSLIST;

. Когда вы обнаружите процесс блокировки, найдите его id и запустите:

KILL {id};

Повторно запустите свой первоначальный запрос .

10
ответ дан Bassem El Hachem 27 August 2018 в 20:21
поделиться

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

-2
ответ дан Dare 27 August 2018 в 20:21
поделиться

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

-2
ответ дан Deon Takpuie 27 August 2018 в 20:21
поделиться

Количество строк не огромно ... Создайте индекс в account_import_id, если это не первичный ключ.

CREATE INDEX idx_customer_account_import_id ON customer (account_import_id);
1
ответ дан gladiator 27 August 2018 в 20:21
поделиться

100% с тем, что сказал MarkR. autocommit делает каждый оператор транзакцией одного оператора.

SHOW ENGINE INNODB STATUS должен дать вам некоторые подсказки относительно причины взаимоблокировки. Посмотрите также на свой журнал медленных запросов, чтобы узнать, что еще запрашивает таблица, и попытайтесь удалить все, что делает полную таблицу. Блокировка уровня строк работает хорошо, но не тогда, когда вы пытаетесь заблокировать все строки!

12
ответ дан James C 27 August 2018 в 20:21
поделиться

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

5
ответ дан John Kane 27 August 2018 в 20:21
поделиться

КАК ОТКРЫТЬ UNLOCK для заблокированных таблиц в MySQL:

Ломающиеся блокировки, подобные этому, могут привести к тому, что atomicity в базе данных не будет применяться в операторах sql, вызвавших блокировку.

Это хаки, и правильным решением является исправить ваше приложение, вызвавшее блокировки.

1) Введите MySQL

mysql -u your_user -p

2) Давайте посмотрим список заблокированных таблиц

g5]

mysql> show open tables where in_use>0;

3) Посмотрим список текущих процессов, один из которых заблокирует вашу таблицу (ы)

mysql> show processlist;

4) Убейте один из этих процессов

mysql> kill <put_process_id_here>;
220
ответ дан Lars Andren 27 August 2018 в 20:21
поделиться
mysql> set innodb_lock_wait_timeout=100

Query OK, 0 rows affected (0.02 sec)

mysql> show variables like 'innodb_lock_wait_timeout';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| innodb_lock_wait_timeout | 100   |
+--------------------------+-------+

Теперь снова запустите блокировку. У вас есть 100 секунд времени, чтобы выдать SHOW ENGINE INNODB STATUS\G в базу данных и посмотреть, какая другая транзакция блокирует ваши.

70
ответ дан pi. 27 August 2018 в 20:21
поделиться

Посмотрите, настроена ли ваша база данных. Особенно изоляция транзакций. Не рекомендуется добавлять переменную innodb_lock_wait_timeout.

Проверьте уровень изоляции транзакции базы данных в mysql cli:

mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation, @@session.tx_isolation;
+-----------------------+-----------------+------------------------+
| @@GLOBAL.tx_isolation | @@tx_isolation  | @@session.tx_isolation |
+-----------------------+-----------------+------------------------+
| REPEATABLE-READ       | REPEATABLE-READ | REPEATABLE-READ        |
+-----------------------+-----------------+------------------------+
1 row in set (0.00 sec)

Вы можете получить улучшения, изменяющие уровень изоляции, используя oracle, как READ COMMITTED вместо REPEATABLE READ (по умолчанию InnoDB)

mysql> SET tx_isolation = 'READ-COMMITTED';
Query OK, 0 rows affected (0.00 sec)

mysql> SET GLOBAL tx_isolation = 'READ-COMMITTED';
Query OK, 0 rows affected (0.00 sec)

mysql> 

Также попробуйте использовать SELECT FOR UPDATE только в случае необходимости.

54
ответ дан saisyukusanagi 27 August 2018 в 20:21
поделиться

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

0
ответ дан Smitty 27 August 2018 в 20:21
поделиться

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

0
ответ дан TomoMiha 27 August 2018 в 20:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: