Pytanie:
SELECT COUNT(online.account_id) cnt from online;
Ale tabela online jest również modyfikowana przez zdarzenie, więc często widzę blokadę, uruchamiając show processlist
.
Czy jest jakaś gramatyka w MySQL, która może spowodować, że instrukcja select nie spowoduje blokad?
I zapomniałem wspomnieć powyżej, że znajduje się on w podrzędnej bazie danych MySQL.
Po dodaniu do my.cnf:transaction-isolation = READ-UNCOMMITTED
slave'a spotkam się z błędem:
Błąd „Rejestracja binarna nie jest możliwa. Komunikat: Poziom transakcji „READ-UNCOMMITTED” w InnoDB nie jest bezpieczny w trybie binlog „STATEMENT” w zapytaniu
Czy jest więc zgodny sposób na zrobienie tego?
Odpowiedzi:
Znaleziono artykuł zatytułowany „MYSQL WITH NOLOCK”
https://web.archive.org/web/20100814144042/http://sqldba.org/articles/22-mysql-with-nolock.aspx
w MS SQL Server wykonasz następujące czynności:
a odpowiednikiem MYSQL jest
EDYTOWAĆ
Michael Mior zasugerował co następuje (z komentarzy)
źródło
SESSION
poziom transakcji obowiązywał tylko dla następnej transakcji. Następnie po prostu zamień trzecią instrukcję powyżej naCOMMIT
. W tym przypadku będzie to noop, ale będzie miało efekt uboczny zakończenia transakcji i zresetowania do domyślnego poziomu izolacji.SET TRANSACTION
stan instrukcji : „Ta instrukcja określa poziom izolacji transakcji, używany do operacji na tabelach InnoDB”.Jeśli tabela to InnoDB, zobacz http://dev.mysql.com/doc/refman/5.1/en/innodb-consistent-read.html - używa spójnego odczytu (tryb bez blokowania) dla WYBORÓW „, które to robią nie określaj FOR UPDATE lub LOCK IN SHARE MODE, jeśli opcja innodb_locks_unsafe_for_binlog jest ustawiona, a poziom odseparowania transakcji nie jest ustawiony na SERIALIZABLE. W związku z tym żadne blokady nie są ustawiane w wierszach odczytywanych z wybranej tabeli ".
źródło
Posługiwać się
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED.
Dokumenty w wersji 5.0 są tutaj .
Dokumenty w wersji 5.1 są tutaj .
źródło
Możesz przeczytać tę stronę podręcznika MySQL. Sposób blokowania tabeli zależy od typu tabeli.
MyISAM używa blokad tabel, aby osiągnąć bardzo dużą prędkość odczytu, ale jeśli masz oczekującą instrukcję UPDATE, to przyszłe SELECTS ustawią się w kolejce za UPDATE.
Tabele InnoDB używają blokowania na poziomie wierszy i nie będziesz mieć całej tabeli zablokowanej za UPDATE. Z InnoDB wiąże się inny rodzaj problemów z blokowaniem, ale może się okazać, że odpowiada on Twoim potrzebom.
źródło
W zależności od typu stołu, blokowanie będzie działać inaczej, ale liczy się też SELECT. W przypadku tabel MyISAM prosta tabela SELECT count (*) FROM nie powinna blokować tabeli, ponieważ uzyskuje dostęp do metadanych w celu pobrania liczby rekordów. Innodb zajmie więcej czasu, ponieważ musi złapać tabelę w migawce, aby policzyć rekordy, ale nie powinno powodować blokowania.
Powinieneś przynajmniej ustawić concurrent_insert na 1 (domyślnie). Następnie, jeśli w pliku danych nie ma "luk" do wypełnienia tabeli, do pliku zostaną dołączone wstawki, a operacje SELECT i INSERT mogą być wykonywane jednocześnie z tabelami MyISAM. Należy zauważyć, że usunięcie rekordu powoduje powstanie „luki” w pliku danych, która będzie próbowała wypełnić przyszłe wstawienia i aktualizacje.
Jeśli rzadko usuwasz rekordy, możesz ustawić wartość concurrent_insert na 2, a wstawienia będą zawsze dodawane na końcu pliku danych. Następnie zaznaczenia i wstawienia mogą odbywać się jednocześnie, ale plik danych nigdy nie będzie mniejszy, bez względu na to, ile rekordów usuniesz (z wyjątkiem wszystkich rekordów).
Podsumowując, jeśli masz dużo aktualizacji, wstawek i selekcji w tabeli, powinieneś uczynić to InnoDB. Możesz jednak dowolnie mieszać typy tabel w systemie.
źródło
Innym sposobem włączenia brudnego odczytu w mysql jest dodanie wskazówki: LOCK IN SHARE MODE
źródło
Z tego odniesienia:
źródło
SELECT zwykle nie blokują tabel InnoDB, na których Ci zależy. Domyślny poziom izolacji transakcji oznacza, że wybory nie blokują rzeczy.
Oczywiście nadal dochodzi do sporów.
źródło
show processlist
aby faktycznie zobaczyć zamki. Można więc bezpiecznie założyć, że w rzeczywistości są otwierane zamki.