Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wyjaśnij niewytłumaczalny impas

Po pierwsze, zakleszczenia nie zależą od jawnego blokowania. LOCK TABLE w MySQL lub używanie innych niż domyślne tryby izolacji transakcji NIE muszą mieć zakleszczenia. Nadal możesz mieć impas, jeśli nigdy nie użyjesz wyraźnej transakcji.

Zakleszczenia mogą się dość łatwo zdarzyć na jednym stole. Najczęściej jest to jeden gorący stół.

Zakleszczenia mogą wyrównać się stanie, jeśli wszystkie twoje transakcje po prostu wstawią jeden wiersz.

Jeśli masz, może dojść do impasu

  • Więcej niż jedno połączenie z bazą danych (oczywiście)
  • Każda operacja, która wewnętrznie obejmuje więcej niż jedną blokadę.

To, co nie jest oczywiste, to fakt, że w większości przypadków jednorzędowe wstawienie lub aktualizacja obejmuje więcej niż jeden zamek. Powodem tego jest to, że indeksy pomocnicze również muszą być zablokowane podczas wstawiania/aktualizacji.

SELECTy nie zostaną zablokowane (zakładając, że używasz domyślnego trybu izolacji i nie używasz FOR UPDATE), więc nie mogą być przyczyną.

SHOW ENGINE INNODB STATUS jest Twoim przyjacielem. Da ci mnóstwo (co prawda bardzo mylących) informacji na temat zakleszczeń, w szczególności najnowszego.

  • Nie można całkowicie wyeliminować zakleszczeń, będą one nadal występować w produkcji (nawet w systemach testowych, jeśli zostaną odpowiednio naprężone)
  • Dąż do bardzo małej liczby zakleszczeń. Jeśli 1% Twoich transakcji utknie, prawdopodobnie jest to za dużo.
  • Rozważ zmianę poziomu izolacji transakcji na zatwierdzone do odczytu, JEŚLI W PEŁNI ROZUMIESZ IMPLIKACJA
  • upewnij się, że oprogramowanie odpowiednio obsługuje zakleszczenia.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. System śledzenia MySQL

  2. Co lepsze - wiele małych stolików czy jeden duży stół?

  3. Dynamiczne pytania dotyczące bezpieczeństwa witryny (PHP + MySQL)

  4. Wyszukaj tekst w polach w każdej tabeli bazy danych MySQL

  5. Ręcznie określ wartość klucza podstawowego w kolumnie JPA @GeneratedValue