Uzyskanie "przekroczony limit oczekiwania na blokadę; spróbuj ponownie uruchomić transakcję", nawet jeśli nie używam transakcji

Uruchamiam następującą instrukcję MySQL UPDATE:

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

Nie korzystam z transakcji, więc dlaczego miałbym dostać ten błąd? Próbowałem nawet zrestartować serwer MySQL i to nie pomogło.

Tabela zawiera 406 733 wierszy.

Author: shgnInc, 2011-04-29

18 answers

Używasz transakcji; autocommit nie wyłącza transakcji, po prostu sprawia, że są one automatycznie zatwierdzane na końcu instrukcji.

Dzieje się tak, że jakiś inny wątek trzyma blokadę rekordów na jakimś rekordzie (aktualizujesz każdy rekord w tabeli!) zbyt długo, a Twój wątek jest przeterminowany.

Możesz zobaczyć więcej szczegółów wydarzenia, wydając

SHOW ENGINE INNODB STATUS

Po zdarzeniu (w edytorze sql). Najlepiej zrobić to na cichej maszynie testowej.

 228
Author: MarkR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-28 08:42:17

Jak wymusić odblokowanie zablokowanych tabel w MySQL:

Łamanie takich blokad może spowodować, że atomiczność w bazie danych nie będzie wymuszona na poleceniach sql, które spowodowały blokadę.

To jest hackish, a właściwym rozwiązaniem jest naprawienie aplikacji, która spowodowała blokady. Jednak, gdy dolary są na linii, szybkie kopnięcie spowoduje, że wszystko ruszy ponownie.

1) Wpisz MySQL

mysql -u your_user -p

2) zobaczmy listę zablokowanych tabel

mysql> show open tables where in_use>0;

3) Zobaczmy listę bieżących procesów, jeden z nich blokuje Twoją tabelę(y)

mysql> show processlist;

4) zabić jeden z tych procesów

mysql> kill <put_process_id_here>;
 371
Author: Eric Leschinski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-24 09:19:00
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   |
+--------------------------+-------+
Teraz uruchom ponownie zamek. Masz 100 sekund na wystawienie SHOW ENGINE INNODB STATUS\G do bazy danych i sprawdzenie, która inna transakcja blokuje Twoją.
 110
Author: veen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-23 09:45:18

Sprawdź, czy Twoja baza danych jest dopracowana. Szczególnie izolacja transakcji. Nie jest dobrym pomysłem zwiększenie zmiennej innodb_lock_wait_timeout.

Sprawdź poziom izolacji transakcji w bazie danych w 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)

Możesz uzyskać ulepszenia zmieniające poziom izolacji de, użyj oracle jak read COMMITTED zamiast powtarzalnego odczytu (domyślnie 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> 

Spróbuj również użyć SELECT do aktualizacji tylko w razie potrzeby.

 77
Author: saisyukusanagi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-13 02:42:03

Żadne z proponowanych rozwiązań nie zadziałało dla mnie, ale to zadziałało.

Coś blokuje wykonanie zapytania. Najprawdopodobniej kolejne zapytanie aktualizuje, wstawia lub usuwa z jednej z tabel w zapytaniu. Musisz się dowiedzieć co to jest:

SHOW PROCESSLIST;

Po zlokalizowaniu procesu blokowania znajdź jego id i uruchom :

KILL {id};

Uruchom ponownie początkowe zapytanie.

 30
Author: BassMHL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-22 15:55:45

100% z tym, co powiedział MarkR. autocommit sprawia, że każda instrukcja jest jedną transakcją.

SHOW ENGINE INNODB STATUS powinno dać ci jakieś wskazówki co do impasu. Dobrze przyjrzeć się dziennikowi powolnych zapytań zbyt, aby zobaczyć, co jeszcze odpytywania tabeli i spróbuj usunąć wszystko, co robi pełny tablescan. Blokowanie poziomu wiersza działa dobrze, ale nie wtedy, gdy próbujesz zablokować wszystkie wiersze!

 12
Author: James C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-29 21:07:45

Czy możesz zaktualizować jakikolwiek inny rekord w tej tabeli, czy ta tabela jest mocno używana? Myślę, że podczas próby uzyskania blokady, która musi zaktualizować ten rekord, timeout, który został ustawiony, wygasł. Może być w stanie zwiększyć czas, który może pomóc.

 5
Author: John Kane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-29 19:48:30

Liczba wierszy nie jest duża... Utwórz indeks na account_import_id, jeśli nie jest kluczem głównym.

CREATE INDEX idx_customer_account_import_id ON customer (account_import_id);
 3
Author: gladiator,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-29 18:16:15

Jeśli właśnie zabiłeś Duże zapytanie, zajmie to trochę czasu rollback. Jeśli wyślesz inne zapytanie przed wykonaniem zabitego zapytania, może pojawić się błąd limitu czasu blokady. To mi się przytrafiło. Rozwiązaniem było tylko trochę poczekać.

Szczegóły:

Wydałem zapytanie DELETE, aby usunąć około 900 000 z około 1 miliona wierszy.

Uruchomiłem to przez pomyłkę (usuwa tylko 10% wierszy): DELETE FROM table WHERE MOD(id,10) = 0

Zamiast tego (usuwa 90% z wiersze): DELETE FROM table WHERE MOD(id,10) != 0

Chciałem usunąć 90% wierszy, a nie 10%. Więc zabiłem proces w linii poleceń MySQL, wiedząc, że cofnie wszystkie wiersze, które do tej pory usunął.

Potem natychmiast uruchomiłem poprawną komendę, a wkrótce potem pojawił się błąd lock timeout exceeded. Zdałem sobie sprawę, że zamek może być w rzeczywistości rollback zabitego zapytania nadal dzieje się w tle. Więc poczekałem kilka sekund i ponownie uruchomiłem zapytanie.

 3
Author: Buttle Butkus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-24 03:08:52
mysql->SHOW PROCESSLIST;
kill xxxx; 

A następnie zabić, który z nich we śnie. W moim przypadku jest to 2456.

Tutaj wpisz opis obrazka

 2
Author: Ahmad Sharif,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-26 18:25:22

Upewnij się, że tabele baz danych używają mechanizmu przechowywania InnoDB i poziomu izolacji transakcji z zatwierdzeniem odczytu.

Możesz to sprawdzić wybierając @ @ GLOBAL.tx_isolation, @ @ tx_isolation; na konsoli mysql.

Jeśli nie jest ustawiona na Read-COMMITTED, musisz ją ustawić. Przed ustawieniem upewnij się, że masz SUPER uprawnienia w mysql.

Możesz skorzystać z pomocy http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html .

Ustawiając to myślę, że Twój problem zostanie rozwiązany.


Możesz również sprawdzić, czy nie próbujesz zaktualizować tego w dwóch procesach jednocześnie. Użytkownicy (@tala ) napotkali podobne komunikaty o błędach w tym kontekście, może sprawdź to dwukrotnie...

 1
Author: Ravi Chhatrala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-24 05:26:20

Pochodzę z Google i chciałem tylko dodać rozwiązanie, które działało dla mnie. Mój problem polegał na tym, że próbowałem usunąć rekordy ogromnej tabeli, która miała dużo FK w kaskadzie, więc dostałem ten sam błąd co OP.

Wyłączyłem autocommit, a potem zadziałało dodanie COMMIT na końcu zdania SQL. O ile rozumiem, zwalnia to bufor bit po bitie, zamiast czekać na końcu polecenia.

Aby trzymać się przykładu OP, powinno to mieć "przepracowany": {]}

mysql> set autocommit=0;

mysql> update customer set account_import_id = 1; commit;

Nie zapomnij ponownie aktywować autocommit, jeśli chcesz zostawić konfigurację MySQL jak wcześniej.

mysql> set autocommit=1;

 1
Author: Kamae,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-09 22:26:25

Spóźniony na imprezę (jak zwykle) jednak moim problemem był fakt, że napisałem trochę złego SQL (będąc nowicjuszem) i kilka procesów miało blokadę na płycie (- ach) SHOW PROCESSLIST, a następnie zabić identyfikatory za pomocą KILL <id>

 0
Author: Smitty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-17 16:22:51

Takie rzeczy przydarzyły mi się, gdy używałem php konstrukcja języka exit; w środku transakcji. Wtedy to transakcja "zawiesza się" i musisz zabić proces mysql (opisany powyżej za pomocą processlist;)

 0
Author: TomoMiha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-02 11:22:39

W moim przypadku uruchamiałem Nieprawidłowe zapytanie, aby naprawić dane. jeśli zablokujesz tabele w zapytaniu, nie będziesz musiał radzić sobie z limitem czasu blokady:

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

To prawdopodobnie nie jest dobry pomysł do normalnego użytkowania.

Aby uzyskać więcej informacji zobacz: MySQL 8.0 Reference Manual

 0
Author: Jeff Luyet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-05 23:27:56

Natknąłem się na to mając 2 doktryny połączeń DBAL, jeden z tych jako nietransakcyjnych( dla ważnych logów), są one przeznaczone do pracy równolegle nie zależą od siebie.

CodeExecution(
    TransactionConnectionQuery()
    TransactionlessConnectionQuery()
)

Moje testy integracyjne zostały zapakowane w transakcje w celu wycofania danych po bardzo testach.

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

Moim rozwiązaniem było wyłączenie transakcji owijania w tych testach i zresetowanie danych db w inny sposób.

 0
Author: Fabian Picone,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-25 14:36:59

Spróbuj zaktualizować dwa poniższe parametry, ponieważ muszą mieć wartości domyślne.

Innodb_lock_wait_timeout = 50

Innodb_rollback_on_timeout = ON

Do sprawdzenia wartości parametru możesz użyć poniższego SQL.

Pokaż zmienne globalne, takie jak 'innodb_rollback_on_timeout';

 0
Author: Mitesh Sharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-18 05:35:04

Miał ten sam błąd, chociaż aktualizowałem tylko jedną tabelę jednym wpisem, ale po ponownym uruchomieniu mysql został rozwiązany.

 -4
Author: tubostic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-11 11:38:46