Jeżeli od jakiegoś czasu pracujesz z MySQL, prawdopodobnie słyszałeś terminy „blokowanie na poziomie tabeli” i „blokowanie na poziomie wiersza”. Terminy te odnoszą się do szczegółowości blokad w MySQL - w tym blogu wyjaśnimy, co oznaczają i do czego można ich użyć.
Co to jest szczegółowość blokowania w MySQL?
Każdy silnik pamięci masowej MySQL obsługuje różne poziomy szczegółowości swoich blokad. MySQL ma trzy poziomy blokowania:blokowanie na poziomie wiersza, blokowanie na poziomie strony i blokowanie na poziomie tabeli. Każdy silnik pamięci masowej MySQL implementuje blokowanie w inny sposób, co daje kilka wyraźnych zalet i wad. Najpierw przyjrzymy się szczegółowości blokad, a następnie przyjrzymy się, jak wszystko działa w różnych silnikach pamięci masowej.
Ogólnie rzecz biorąc, blokady w MySQL należą do jednej z tych kategorii. Zamki mogą być:
-
Poziom strony - takie typy granulacji blokad były dostępne w starszych silnikach MySQL, a konkretnie w BDB, który jest teraz przestarzałe od MySQL 5.1. Krótko mówiąc, BDB był silnikiem pamięci masowej zawartym w starszych wersjach MySQL i był to silnik pamięci transakcyjnej, który wykonywał blokady na poziomie strony. Ponieważ te rodzaje granulacji blokad nie są już używane, nie będziemy się tutaj zagłębiać, ale ogólnie te blokady są ograniczone do danych i indeksów znajdujących się na określonej stronie. Jeśli chcesz dowiedzieć się więcej o BDB, strona MariaDB powinna zawierać więcej informacji.
-
Na poziomie tabeli — MySQL używa blokowania na poziomie tabeli dla wszystkich silników pamięci masowej oprócz InnoDB.
-
Row-level - blokowanie na poziomie wiersza jest używane przez InnoDB.
Zalety i wady blokowania na poziomie tabeli
MySQL używa blokowania na poziomie tabeli dla wszystkich silników pamięci masowej z wyjątkiem InnoDB, co oznacza, że blokowanie na poziomie tabeli jest używane dla tabel z silnikami pamięci masowej MyISAM, MEMORY i MERGE, umożliwiając tylko jedną sesję na jednorazową aktualizację tabel . Blokady na poziomie tabeli mają pewne wyraźne zalety w porównaniu z blokadami na poziomie wiersza (na przykład blokowanie na poziomie tabeli ogólnie wymaga nieco mniej pamięci niż blokowanie na poziomie wiersza, ponieważ blokowanie na poziomie wiersza wymaga pewnej ilości pamięci na wiersz (lub grupę) wierszy które są zablokowane i zwykle jest to szybkie, ponieważ w grę wchodzi tylko jedna blokada.Blokady zapisu tabeli są nakładane na tabelę, jeśli nie ma na niej żadnych blokad - jeśli na danej tabeli istnieją wcześniej blokady, żądania blokady tabeli są umieszczane kolejki żądań odczytu. Warto wspomnieć, że blokowanie na poziomie tabeli ma również pewne wyraźne wady, unikalne dla siebie – na przykład może nie być zbyt dobre dla aplikacji, które wymagają wielu transakcji, które są wykonywane „w tę iz powrotem” (np. , aplikacja bankowości internetowej), ponieważ tylko jedna sesja może zapisywać do tabeli w danym momencie, a niektóre tabele obsługujące blokowanie na poziomie tabeli (takie jak MyISAM) nie obsługują modelu ACID.
Oto przykład:wyobraź sobie aplikację bankową, która używa dwóch tabel w bazie danych – powiedzmy, że te tabele nazywają się „czekowymi” i „oszczędnościowymi”. Musisz przenieść 100 USD z konta czekowego danej osoby na jej konto oszczędnościowe. Logicznie należy wykonać następujące czynności:
-
Upewnij się, że saldo konta przekracza 100 USD.
-
Odejmij 100 USD od rachunku bieżącego.
-
Dodaj 100 USD do konta oszczędnościowego.
Aby wykonać te czynności, potrzebujesz kilku zapytań, na przykład:
SELECT balance FROM checking WHERE account_id = 123;
UPDATE checking SET balance = balance - 100 WHERE account_id = 123;
UPDATE savings SET balance = balance + 100 WHERE account_id = 123;
Te zapytania mogą wyglądać na proste, ale jeśli używasz MyISAM (jako przykładu używamy MyISAM, ponieważ jest to jeden z podstawowych silników pamięci masowej obsługujący blokady na poziomie tabeli), powinieneś wiedzieć, że silnik również nie obsługuje ACID, co oznacza, że jeśli serwer bazy danych ulegnie awarii podczas wykonywania któregokolwiek z tych zapytań, nie masz szczęścia:ludzie mogą skończyć z gotówką na obu kontach lub na żadnym z nich. Jedynym silnikiem obsługującym transakcje oparte na ACID w MySQL jest InnoDB, więc jeśli potrzebujesz wielu niezawodnych transakcji, warto się temu przyjrzeć. InnoDB obsługuje również blokowanie na poziomie wiersza — oto, czym się teraz zajmiemy.
Zalety i wady blokowania na poziomie rzędu
MySQL używa blokowania na poziomie wiersza dla tabel InnoDB, aby obsługiwać jednoczesny dostęp do zapisu w wielu sesjach. Niektóre zalety korzystania z blokowania na poziomie wiersza obejmują możliwość blokowania pojedynczego wiersza przez długi czas i mniejszą liczbę konfliktów blokad, gdy wiele wątków uzyskuje dostęp do różnych wierszy. Jednak blokowanie na poziomie wiersza ma również wady:jedną z nich jest to, że blokowanie na poziomie wiersza zwykle zajmuje więcej pamięci niż blokowanie na poziomie strony lub tabeli, jest również zwykle wolniejsze niż blokady na poziomie strony lub tabeli, ponieważ mechanizm musi zdobyć więcej zamków. InnoDB jest jednym z silników obsługujących mechanizm blokowania na poziomie wiersza:jest również zgodny z ACID, co oznacza, że dobrze nadaje się do aplikacji opartych na transakcjach (patrz przykład powyżej). Teraz przyjrzymy się, jak działa szczegółowość blokad w jednym z silników pamięci masowej MySQL.
Jak działa szczegółowość blokowania w InnoDB?
InnoDB jest powszechnie znany z tego, że obsługuje blokowanie na poziomie wiersza, ale warto również zauważyć, że silnik obsługuje wiele typów blokowania, co oznacza, że można używać zarówno blokad na poziomie wiersza, jak i tabeli. InnoDB wykonuje blokowanie na poziomie wiersza, ustawiając blokady współdzielone lub wyłączne na rekordach indeksu napotkanych podczas przeszukiwania lub skanowania indeksu tabeli. Wspólna blokada to taka blokada, która pozwala transakcji, która utrzymuje blokadę, na odczytanie danego wiersza, z drugiej strony blokada na wyłączność pozwala transakcji, która utrzymuje blokadę, na aktualizację lub usunięcie wiersza.
InnoDB ma również inne rodzaje blokad - niektóre z nich obejmują blokady współdzielone i wyłączne, blokady intencji, blokady rekordów, blokady luki, blokady następnego klucza i blokady następnego zamiaru. Na przykład blokady intencji mogą być również wspólne lub wyłączne - takie blokady zwykle wskazują, że transakcja ma na celu ustawienie określonego typu blokady (blokada współdzielona lub blokada wyłączna) na poszczególnych wierszach w tabeli, blokada rekordu jest zablokować rekord indeksu itp.
Ogólnie rzecz biorąc, szczegółowość blokowania InnoDB różni się od granulacji blokowania występującej w innych silnikach pamięci masowej MySQL (na przykład MyISAM), ponieważ gdy używane jest blokowanie na poziomie tabeli, tylko jedna sesja aktualizuje określone tabele czas może biec. Gdy używane jest blokowanie na poziomie wiersza, MySQL obsługuje jednoczesny dostęp do zapisu w wielu sesjach, dzięki czemu aparaty pamięci masowej z blokowaniem na poziomie wiersza (InnoDB) są odpowiednim wyborem dla aplikacji o znaczeniu krytycznym.
Dokładność blokowania i zakleszczenia
Rozdrobnienie i poziomy blokowania w MySQL mogą być świetną rzeczą, ale mogą również powodować problemy. Jednym z najczęstszych problemów spowodowanych granulacją blokad są zakleszczenia — zakleszczenie występuje, gdy różne transakcje MySQL nie mogą być kontynuowane, ponieważ każda z nich posiada blokadę, której potrzebuje druga. Na szczęście podczas korzystania z silnika pamięci masowej InnoDB wykrywanie zakleszczeń jest domyślnie włączone — po wykryciu zakleszczenia InnoDB automatycznie wycofuje transakcję. Jeśli napotkasz zakleszczenia, gdy masz do czynienia z granulacją blokad w MySQL, nie martw się - rozważ po prostu ponowne uruchomienie transakcji. Aby proaktywnie monitorować bazę danych, należy również rozważyć wykorzystanie funkcji zapewnianych przez ClusterControl.
Jak ClusterControl może Ci pomóc?
Oto niektóre z rzeczy, w których ClusterControl opracowany przez Manynines może Ci pomóc:
-
Ochrona wszystkich Twoich danych biznesowych
-
Jeśli dane są uszkodzone (może to być spowodowane nieużywaniem silnika pamięci masowej zgodnego z ACID lub inne czynniki, jak opisano powyżej), narzędzie może uruchomić automatyczny proces, który faktycznie weryfikuje, czy możesz odzyskać dane.
-
Narzędzie może poinformować, które bazy danych nie mają kopii zapasowych lub pokazać stan kopii zapasowych (czy odnieśli sukces lub ponieśli porażkę)
-
-
Automatyzacja operacji na bazie danych
-
ClusterControl może pomóc w zapewnieniu, że administratorzy, programiści i administratorzy baz danych skutecznie zarządzają całymi klastrami baz danych przy minimalnym ryzyku przy użyciu branży najlepsze praktyki
-
-
Efektywne ogólne zarządzanie infrastrukturą bazy danych
-
Dzisiejsza zmiana technologii w połączeniu z wyrafinowanymi rozwiązaniami infrastrukturalnymi wymaga zaawansowanych narzędzi i wiedzy, aby osiągnąć wysoką dostępność i optymalną wydajność dla aplikacje o znaczeniu krytycznym dla firmy. ClusterControl może również pomóc we wdrażaniu, monitorowaniu, zarządzaniu i skalowaniu najpopularniejszych technologii baz danych typu open source, w tym MySQL, MariaDB, MongoDB, PostgreSQL, TimeScaleDB i innych.
-
Aby dowiedzieć się więcej o tym, jak ClusterControl może pomóc usprawnić operacje biznesowe, zaglądaj na bloga bazy danych Manynines.
Podsumowanie
Różne silniki pamięci masowej MySQL mają dostępne różne typy granulacji blokad. Przed podjęciem decyzji o wyborze silnika pamięci masowej, którego powinieneś użyć, upewnij się, że znasz jak najwięcej informacji o danym silniku pamięci masowej (na przykład, jak już wspomniano, należy unikać MyISAM w przypadku danych o znaczeniu krytycznym, ponieważ nie są one zgodne z ACID), zrozum wszystkie powiązane implikacje dotyczące wydajności, w tym szczegółowość blokad, zakleszczenia i inne, i wybieraj mądrze.