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.
Zrób najpierw to
Sporadyczne są normalne. Jeśli zdarza się bez przerwy, jakiś skrypt zapisuje o wiele za często.
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
Dwa zapisy tego samego gracza naraz
Autozapis i ręczny zapis ścigające się o ten sam wiersz.
- 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
Długa transakcja trzymająca blokady
Otwarta transakcja, potem coś wolnego zrobione w środku, potem commit.
- 4
Masowy UPDATE w szczycie
Wypłata albo wipe dotykające każdego wiersza, kiedy gracze też są zapisywani.
- 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 FixerDla tego rodzaju błędu Script Optimizer wyłapuje wzorce zapytań, które to powodują.