Dvoufázové zamykáníEdit
Podle protokolu dvoufázového zamykání transakce zpracovává své zámky ve dvou různých, po sobě jdoucích fázích během provádění transakce:
- Rozšiřující fáze (také známá jako fáze růstu): zámky jsou získávány a žádné zámky nejsou uvolňovány (počet zámků se může pouze zvyšovat).
- Fáze zmenšování (neboli fáze zmenšování): zámky jsou uvolňovány a nejsou získávány žádné zámky.
Pravidla zamykání ve dvou fázích lze shrnout takto: Nikdy nezískávejte zámek po uvolnění zámku. Vlastnost serializovatelnosti je zaručena pro plán s transakcemi, které toto pravidlo dodržují.
Typicky, bez explicitní znalosti v transakci o konci fáze 1, je bezpečně zjištěno, až když transakce dokončí zpracování a požádá o commit. V takovém případě mohou být všechny zámky uvolněny najednou (fáze 2).
Konzervativní dvoufázové zamykáníEdit
Rozdíl mezi 2PL a C2PL spočívá v tom, že transakce C2PL získávají všechny zámky, které potřebují, před zahájením transakcí. To má zajistit, že transakce, která již drží některé zámky, nebude blokovat čekání na další zámky. Konzervativní 2PL zabraňuje deadlockům.
Striktní dvoufázové zamykáníEdit
Pro dodržení protokolu S2PL musí transakce dodržovat 2PL a uvolnit své zápisové (exkluzivní) zámky až poté, co skončí, tj. je buď odevzdána, nebo přerušena. Naproti tomu zámky pro čtení (sdílené) se uvolňují pravidelně během fáze 2. Tento protokol není vhodný v B-stromech, protože způsobuje Bottleneck (přitom B-stromy vždy začínají prohledávat od nadřazeného kořene).
Silné striktní dvoufázové zamykáníEdit
nebo Rigorousness, nebo Rigorous scheduling, nebo Rigorous two-phase locking
Pro dodržení silného striktního dvoufázového zamykání (SS2PL) zamykací protokol uvolňuje jak zápisové (exkluzivní), tak čtecí (sdílené) zámky použité transakcí až po jejím ukončení, tj. po ukončení transakce, teprve poté, co se dokončí (jsou připraveny) a jsou buď odevzdány, nebo přerušeny. Tento protokol je rovněž v souladu s pravidly S2PL. Na transakci dodržující SS2PL lze pohlížet tak, že má fázi 1, která trvá po celou dobu provádění transakce, a žádnou fázi 2 (nebo degenerovanou fázi 2). Zůstává tedy vlastně jen jedna fáze a „dvoufázový“ v názvu se zřejmě stále využívá vzhledem k historickému vývoji pojmu z 2PL a k tomu, že 2PL je nadtřída. Vlastnost rozvrhu SS2PL se také nazývá Rigoróznost. Je to také název třídy rozvrhů, které tuto vlastnost mají, a SS2PL rozvrh se také nazývá „rigorózní rozvrh“. Termín „Rigoróznost“ je oproštěn od zbytečného odkazu „dvoufázovosti“ a také je nezávislý na jakémkoli (blokovacím) mechanismu (v zásadě lze využít i jiné blokovací mechanismy). Příslušný blokovací mechanismus této vlastnosti se někdy označuje jako Rigorous 2PL.
SS2PL je speciálním případem S2PL, tj. třída rozvrhů SS2PL je vlastní podtřídou S2PL (každý rozvrh SS2PL je zároveň rozvrhem S2PL, ale existují i rozvrhy S2PL, které nejsou SS2PL).
SS2PL je protokol řízení souběhu, který si vybrala většina databázových systémů a který se používá od jejich počátků v 70. letech. Osvědčil se jako účinný mechanismus v mnoha situacích a poskytuje kromě serializovatelnosti také striktnost (zvláštní případ bezkaskádové obnovitelnosti), která má zásadní význam pro efektivní obnovení databáze, a také uspořádání závazků (Commitment ordering, CO) pro účast v distribuovaných prostředích, kde se používá řešení distribuované serializovatelnosti založené na CO a globální serializovatelnosti. Jelikož se jedná o podmnožinu CO, existuje efektivní implementace distribuovaného SS2PL bez správce distribuovaných zámků (DLM), přičemž distribuované deadlocky (viz níže) jsou řešeny automaticky. Skutečnost, že SS2PL použitý ve vícedatabázových systémech zajišťuje globální serializovatelnost, byla známa již léta před objevem CO, ale teprve s CO přišlo pochopení úlohy protokolu atomických závazků při udržování globální serializovatelnosti a také pozorování automatického řešení distribuovaných deadlocků (viz podrobný příklad distribuovaného SS2PL). Ve skutečnosti je to, že SS2PL zdědil vlastnosti Recoverability a CO, významnější než to, že je podmnožinou 2PL, který sám o sobě ve své obecné podobě kromě toho, že obsahuje jednoduchý mechanismus serializovatelnosti (serializovatelnost je však implikována i CO), neposkytuje SS2PL žádné další významné vlastnosti. Není známo, že by se 2PL ve své obecné podobě, stejně jako v kombinaci se striktností, tj. striktní 2PL (S2PL), v praxi využíval. Populární SS2PL nevyžaduje označování „konce fáze 1“ jako 2PL a S2PL, a proto je jednodušší na implementaci. Také na rozdíl od obecného 2PL poskytuje SS2PL, jak bylo uvedeno výše, užitečné vlastnosti Strictness a Commitment ordering.
Existuje mnoho variant SS2PL, které využívají různé typy zámků s různou sémantikou v různých situacích, včetně případů změny typu zámku v průběhu transakce. Za zmínku stojí varianty, které používají zamykání s vícenásobnou granularitou.
- SS2PL vs. S2PL: Obě varianty poskytují Serializability a Strictness. Protože S2PL je nadtřída SS2PL, může v principu poskytovat větší souběžnost. Žádná výhoda souběžnosti však není typicky prakticky patrná (u obou existuje naprosto stejné zamykání, přičemž S2PL prakticky nemá o moc dřívější uvolnění zámku) a režie spojená s řešením mechanismu konce fáze 1 v S2PL, odděleného od konce transakce, není opodstatněná. Zatímco SS2PL poskytuje řazení závazků, S2PL nikoliv. To vysvětluje upřednostňování SS2PL před S2PL.
- Zejména před rokem 1990, ale i po něm, se v mnoha článcích a knihách, např. v (Bernstein et al. 1987, s. 59), termín „Strict 2PL“ (S2PL) často definoval pomocí zamykacího protokolu „Release all locks only after transaction end“, což je protokol SS2PL. „Strict 2PL“ tam tedy nemohl být název průniku Strictness a 2PL, který je větší než třída generovaná protokolem SS2PL. To způsobilo zmatek. Explicitní definicí S2PL jako průniku Strictness a 2PL, novým názvem pro SS2PL a explicitním rozlišením tříd S2PL a SS2PL chtěly články (Breitbart et al. 1991) a (Raz 1992) zmatek odstranit: první použil název „rigoróznost“ a druhý „SS2PL“.“
- Existuje obecnější vlastnost než SS2PL (nadtřída rozvrhů), Strict commitment ordering (Strict CO neboli SCO), která stejně jako SS2PL zajišťuje jak serializovatelnost, tak striktnost a CO a má podobnou režii zamykání. Na rozdíl od SS2PL SCO neblokuje při konfliktu čtení a zápisu (zámek pro čtení neblokuje získání zámku pro zápis; SCO i SS2PL mají stejné chování pro konflikty zápis-čtení a zápis-zápis) za cenu možného zpoždění odevzdání a při takovém konfliktu typu SCO má kratší průměrnou dobu dokončení transakce a lepší výkon než SS2PL. Zatímco SS2PL se řídí výše uvedenou tabulkou kompatibility zámků, SCO má následující tabulku:
Typ zámku | zámek pro čtení | zámek pro zápis |
---|---|---|
zámek pro čtení-lock | ||
write-lock | X | X |
Všimněte si, že ačkoli SCO uvolňuje všechny zámky na konci transakce a dodržuje pravidla zamykání 2PL, SCO není podmnožinou 2PL, protože má jinou tabulku kompatibility zámků. SCO umožňuje materializované konflikty čtení a zápisu mezi dvěma transakcemi v jejich fázi 1, což 2PL ve fázi 1 neumožňuje (viz o materializovaných konfliktech v kapitole Serializovatelnost). Na druhou stranu 2PL umožňuje ve fázi 2 jiné typy materializovaných konfliktů, které SCO neumožňuje vůbec. Dohromady to znamená, že třídy rozvrhů 2PL a SCO jsou neporovnatelné (tj. žádná třída neobsahuje druhou třídu).
Shrnutí – Vztahy mezi třídamiUpravit
Mezi libovolnými dvěma třídami rozvrhů (definovanými příslušnými vlastnostmi jejich rozvrhů), které mají společné rozvrhy, buď jedna obsahuje druhou (striktně obsahuje, pokud si nejsou rovny), nebo jsou neporovnatelné. Vztahy obsaženosti mezi třídami 2PL a ostatními hlavními třídami rozvrhů jsou shrnuty v následujícím diagramu. Třída 2PL a její podtřídy jsou ze své podstaty blokující, což znamená, že pro ně neexistují optimistické implementace (a kdykoli je zmíněno „optimistické 2PL“, odkazuje to na jiný mechanismus s třídou, která obsahuje i rozvrhy, které nejsou ve třídě 2PL).