THE ORB
Uruchamiam studio

Zakleszczenie albo przekroczony czas oczekiwania na blokadę

Dwie rzeczy próbowały zapisać ten sam rekord w tej samej chwili i baza anulowała jedną z nich.

groupsSporadycznie nieudany zapiscodePotrzebny programista

Zrób najpierw to

Sporadyczne są normalne. Jeśli zdarza się bez przerwy, jakiś skrypt zapisuje o wiele za często.

bug_reportWklej zamiast tego całą konsolę

Co to znaczy

Dwie transakcje trzymają każda ten wiersz, którego chce druga. MySQL zabija jedną, żeby druga mogła skończyć — ta zabita to błąd, który właśnie czytasz. Lock wait timeout to łagodniejszy kuzyn: nikt się nie zakleszczył, jedno zapytanie po prostu za długo czekało na blokadę i się poddało.

Żadne z tych dwóch to nie uszkodzenie danych. Baza zrobiła, co należy; to kod musi sobie z tym poradzić.

Co to powoduje

Uszeregowane według tego, jak często są odpowiedzią.

  1. 1

    Dwa zapisy tego samego gracza naraz

    Autozapis i ręczny zapis ścigające się o ten sam wiersz.

  2. 2

    Wiersze blokowane w różnej kolejności

    Jedna ścieżka kodu aktualizuje użytkownika, potem pojazd, druga pojazd, potem użytkownika. To podręcznikowe zakleszczenie.

  3. 3

    Długa transakcja trzymająca blokady

    Otwarta transakcja, potem coś wolnego zrobione w środku, potem commit.

  4. 4

    Masowy UPDATE w szczycie

    Wypłata albo wipe dotykające każdego wiersza, kiedy gracze też są zapisywani.

  5. 5

    Brakujące indeksy poszerzają blokadę

    Bez indeksu UPDATE blokuje dużo więcej wierszy, niż potrzebuje.

Jak poznać, który jest twój

SHOW ENGINE INNODB STATUS;

Sekcja LATEST DETECTED DEADLOCK podaje obie transakcje i oba zapytania, co zwykle jest całą diagnozą.

Gdzie szukać

Te dwa zapytania, które nazywa InnoDB, i to, czy dotykają tych samych tabel w różnej kolejności.

Jak to naprawić

Blokuj wszędzie w tej samej kolejności, trzymaj transakcje krótko, zindeksuj to, po czym filtrujesz, i przy zakleszczeniu ponów raz, zamiast wywalać operację:

CREATE INDEX idx_users_identifier ON users (identifier);

Zakleszczenie jest z założenia błędem do ponowienia — druga próba zwykle się udaje, bo kolidująca transakcja już się do tego czasu skończyła.

Wciąż utknąłeś na własnym kodzie?

Ta strona mówi, co ten błąd zwykle oznacza. Wklej swoją konsolę do Server Fixera, a uszereguje wszystko, co w niej jest, i powie, co zrobić najpierw; a jeśli wolisz tego nie ruszać, ORBIE naprawi skrypt i odda ci zasób gotowy do wrzucenia.

bug_reportOtwórz Server Fixer

Dla tego rodzaju błędu Script Optimizer wyłapuje wzorce zapytań, które to powodują.

Błędy, które chodzą z tym w parze