sql >> Databáze >  >> RDS >> Mysql

Vysvětlete nevysvětlitelné zablokování

Za prvé, uváznutí nezávisí na explicitním zamykání. LOCK TABLE MySQL nebo použití jiných než výchozích režimů izolace transakcí NEJSOU vyžadovány pro uváznutí. Stále můžete mít uváznutí, pokud nikdy nepoužijete explicitní transakci.

Zablokování může nastat na jednom stole, a to docela snadno. Nejčastěji je to z jednoho horkého stolu.

Zablokování může dokonce nastane, pokud všechny vaše transakce provedou pouze vložení jednoho řádku.

Pokud máte

, může dojít k uváznutí
  • Více než jedno připojení k databázi (samozřejmě)
  • Jakákoli operace, která interně zahrnuje více než jeden zámek.

Co není zřejmé, je to, že většinou jedno vložení nebo aktualizace řádku zahrnuje více než jeden zámek. Důvodem je to, že sekundární indexy musí být také uzamčeny během vkládání / aktualizací.

SELECTy se nezamknou (za předpokladu, že používáte výchozí režim izolace a nepoužíváte FOR UPDATE), takže nemohou být příčinou.

ZOBRAZIT STAV MOTORU INNODB je váš přítel. Poskytne vám spoustu (nepochybně velmi matoucích) informací o uváznutí, konkrétně o tom nejnovějším.

  • Zablokování nelze zcela eliminovat, bude k nim nadále docházet ve výrobě (i na testovacích systémech, pokud je správně zdůrazníte)
  • Usilujte o velmi nízký počet zablokování. Pokud se 1 % vašich transakcí zablokuje, je to možná příliš mnoho.
  • Zvažte změnu úrovně izolace transakcí u vašich transakcí na hodnotu „přečteno“, POKUD PLNĚ ROZUMÍTE DŮSLEDKŮM
  • zajistěte, aby váš software správně zpracovával uváznutí.


  1. filtrovat vyhledávání pomocí přepínače PHP SQL

  2. Získávání náhodných dat z databáze MySQL, ale neopakování dat

  3. mysqldump s řádkem vytvoření databáze

  4. Vidlit či nevidlit?