sql >> Databáze >  >> RDS >> MariaDB

Pochopení granularity zámků v MySQL

Pokud už nějakou dobu pracujete s MySQL, pravděpodobně jste slyšeli termíny „uzamykání na úrovni tabulky“ a „uzamykání na úrovni řádků“. Tyto termíny odkazují na granularitu zámků v MySQL – v tomto blogu vysvětlíme, co znamenají a k čemu je lze použít.

Co je Granularita zámku v MySQL?

Každý úložiště MySQL podporuje různé úrovně granularity pro své zámky. MySQL má tři úrovně uzamčení:zamykání na úrovni řádků, zamykání na úrovni stránky a zamykání na úrovni tabulky. Každý úložný modul MySQL implementuje zamykání odlišně, což vám dává určité výhody a nevýhody. Nejprve se podíváme na to, co je to granularita zámku, a poté se podíváme na to, jak vše funguje v různých úložných modulech.

Obecně řečeno, zámky v MySQL spadají do jedné z těchto kategorií. Zámky mohou být:

  • Úroveň stránky – takové typy granularit zámků byly dostupné ve starších enginech MySQL, konkrétně BDB, což je nyní zastaralé od MySQL 5.1. Stručně řečeno, BDB byl úložný stroj zahrnutý ve starších verzích MySQL a byl to transakční úložný stroj, který prováděl zámky na úrovni stránky. Vzhledem k tomu, že tyto typy granularit zámků se již nepoužívají, nebudeme je zde podrobně rozebírat, ale obecně jsou tyto zámky omezeny na data a indexy, které jsou umístěny na konkrétní stránce. Pokud se chcete o BDB dozvědět více, stránka na MariaDB by měla poskytnout další informace.

  • Úroveň tabulky – MySQL používá zamykání na úrovni tabulky pro všechny moduly úložiště kromě InnoDB.

  • Řádková úroveň – zamykání na úrovni řádků používá InnoDB.

Výhody a nevýhody zamykání na úrovni stolu

MySQL používá zamykání na úrovni tabulky pro všechny moduly úložiště kromě InnoDB, což znamená, že zamykání na úrovni tabulky se používá pro tabulky, na kterých běží moduly úložiště MyISAM, MEMORY a MERGE, takže aktualizace tabulek je povolena pouze jednou relací . Zámky na úrovni tabulky mají oproti zámkům na úrovni řádků určité výhody (například zamykání na úrovni tabulky obecně vyžaduje o něco méně paměti než zamykání na úrovni řádků, protože zamykání na úrovni řádků vyžaduje určitou paměť na řádek (nebo skupinu) řádků. které jsou zamčené a je to obvykle rychlé, protože se jedná pouze o jeden zámek. Zámky zápisu tabulky jsou umístěny na tabulku, pokud na ní nejsou žádné zámky - pokud jsou na dané tabulce již existující zámky, požadavky na zámek tabulky jsou vloženy fronta žádostí o čtení. Stojí za zmínku, že zamykání na úrovni tabulky má také některé zřetelné nevýhody, které jsou jedinečné samo o sobě – například nemusí být příliš vhodné pro aplikace, které vyžadují mnoho transakcí, které procházejí „tam a zpět“ (např. , aplikace online bankovnictví), protože pouze jedna relace může zapisovat do tabulky v jeden okamžik a některé tabulky, které podporují zamykání na úrovni tabulky (jako je MyISAM), nepodporují model ACID.

Zde je příklad:představte si bankovní aplikaci, která používá dvě tabulky v databázi – řekněme, že tyto tabulky se nazývají „kontrolní“ a „úsporné“. Musíte přesunout 100 $ z běžného účtu osoby na jeho spořicí účet. Logicky byste provedli následující kroky:

  1. Ujistěte se, že zůstatek na účtu je vyšší než 100 USD.

  2. Z běžného účtu odečtěte 100 $.

  3. Přidejte 100 $ na spořicí účet.

K provedení těchto akcí budete potřebovat několik dotazů, například:

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;

Tyto dotazy mohou vypadat jednoduše, ale pokud používáte MyISAM (my používáme MyISAM jako příklad, protože je to jeden z primárních úložišť, který podporuje zámky na úrovni tabulky), měli byste vědět, že engine také nepodporuje ACID, což znamená, že pokud databázový server selže při provádění některého z těchto dotazů, máte smůlu:lidé mohou skončit s hotovostí na obou účtech nebo na žádném z nich. Jediný engine, který podporuje transakce založené na ACID v MySQL, je InnoDB, takže pokud potřebujete hodně spolehlivých transakcí, možná by stálo za to se na něj podívat. InnoDB také podporuje zamykání na úrovni řádků – na to se nyní podíváme.

Výhody a nevýhody zamykání na úrovni řádků

MySQL používá pro tabulky InnoDB zamykání na úrovni řádků pro podporu současného přístupu pro zápis prostřednictvím více relací. Některé z výhod používání zamykání na úrovni řádků zahrnují schopnost uzamknout jeden řádek na dlouhou dobu a méně konfliktů uzamčení, když mnoho vláken přistupuje k různým řádkům. Zamykání na úrovni řádků má však také nevýhody:jednou z nich je, že zamykání na úrovni řádků obvykle zabírá více paměti než zamykání na úrovni stránky nebo tabulky, je také obvykle pomalejší než zámky na úrovni stránky nebo tabulky, protože motor musí získat více zámků. InnoDB je jedním z motorů, který podporuje zamykací mechanismus na úrovni řádků:je také kompatibilní s ACID, což znamená, že se dobře hodí pro aplikace založené na transakcích (viz příklad výše). Nyní se podíváme na to, jak funguje granularita zámků v jednom z úložišť MySQL.

Jak funguje Lock Granularity v InnoDB?

InnoDB je všeobecně známo, že podporuje zamykání na úrovni řádků, ale také stojí za zmínku, že engine podporuje více typů zamykání, což znamená, že můžete použít zámky na úrovni řádků i na úrovni tabulky. InnoDB provádí zamykání na úrovni řádků nastavením sdílených nebo výhradních zámků na záznamech indexu, na které narazí, když prohledává nebo skenuje index tabulky. Sdílený zámek je takový zámek, který umožňuje transakci, která zámek drží, číst příslušný řádek, na druhé straně exkluzivní zámek umožňuje transakci, která zámek drží, aktualizovat nebo smazat řádek.

InnoDB má také další typy zámků – některé z nich zahrnují sdílené a exkluzivní zámky, zámky záměru, zámky záznamů, zámky mezer, zámky dalšího klíče a zámky dalšího záměru. Záměrné zámky mohou být například také sdílené nebo exkluzivní - takové zámky obvykle naznačují, že transakce má v úmyslu nastavit určitý typ zámku (sdílený zámek nebo výhradní zámek) na jednotlivých řádcích tabulky, zámek záznamu je uzamknout záznam indexu atd.

Obecně se granularita zámku InnoDB liší od granularity zámků, která je přítomna v jiných úložných strojích MySQL (například MyISAM), protože když se používá zamykání na úrovni tabulky, pouze jedna relace k aktualizaci určitých tabulek v čas může běžet. Když se používá zamykání na úrovni řádků, MySQL podporuje simultánní přístup k zápisu přes více relací, díky čemuž jsou moduly úložiště s uzamčením na úrovni řádků (InnoDB) vhodnou volbou pro kriticky důležité aplikace.

Uzamčení granularity a zablokování

Zrnitost uzamčení a úrovně zamykání v MySQL může být skvělá věc, ale může také způsobit problémy. Jedním z nejčastějších problémů způsobených granularitou zámků jsou uváznutí – uváznutí nastává, když různé transakce MySQL nemohou pokračovat, protože každá z nich drží zámek, který druhá potřebuje. Naštěstí při použití úložiště InnoDB je detekce uváznutí ve výchozím nastavení povolena - když je detekováno zablokování, InnoDB automaticky vrátí transakci. Pokud při práci s granularitou zámků v MySQL narazíte na uváznutí, nezoufejte – zvažte jednoduché restartování transakce. Chcete-li proaktivně monitorovat svou databázi, měli byste také zvážit využití funkcí poskytovaných ClusterControl.

Jak vám může ClusterControl pomoci?

Zde jsou některé věci, se kterými vám může pomoci ClusterControl vyvinutý společností Somenines:

  • Ochrana všech vašich firemních dat

    • Pokud jsou vaše data poškozena (může to být způsobeno tím, že nepoužíváte úložiště kompatibilní s ACID, nebo další faktory popsané výše) může nástroj spustit automatický proces, který skutečně ověří, že můžete obnovit svá data.

    • Nástroj vám může dát vědět, které databáze nejsou zálohovány, nebo vám může ukázat stav vašich záloh (ať už byli úspěšní nebo selhali)

  • Automatizace vašich databázových operací

    • ClusterControl vám může pomoci zajistit, aby vaši systémoví správci, vývojáři a správci databází spravovali celé clustery databází efektivně s minimálními riziky při použití odvětví osvědčené postupy

  • Efektivní správa vaší databázové infrastruktury obecně

    • Dnešní posun v technologiích v kombinaci se sofistikovanými řešeními infrastruktury vyžaduje pokročilé nástroje a znalosti k dosažení vysoké dostupnosti a optimálního výkonu pro vaše kritické obchodní aplikace. ClusterControl vám také může pomoci s nasazením, monitorováním, správou a škálováním nejoblíbenějších open source databázových technologií včetně MySQL, MariaDB, MongoDB, PostgreSQL, TimeScaleDB a dalších.

Chcete-li se dozvědět více o tom, jak může ClusterControl pomoci zefektivnit vaše obchodní operace, sledujte blog databáze Somenines.

Shrnutí

Různá úložiště MySQL mají k dispozici různé typy granularit zámků. Než se rozhodnete pro úložný modul, který byste měli použít, ujistěte se, že znáte co nejvíce informací o příslušném úložném enginu (například jak již bylo uvedeno, při práci s kritickými daty byste se měli vyhnout MyISAM, protože není kompatibilní s ACID). všech souvisejících důsledků výkonu, včetně granularity zámků, uváznutí a dalších, a vybírejte moudře.


  1. JSON_MERGE_PRESERVE() – Sloučit více dokumentů JSON v MySQL

  2. Jak mohu použít executemany k vložení seznamu slovníků v Pythonu do MySQL

  3. Zjistěte, zda hodnota obsahuje alespoň jednu číselnou číslici v Oracle

  4. Jak zjistit, zda hodnota obsahuje alespoň jednu číselnou číslici v MariaDB