Čo môže vyplynúť z oslabenia úrovne izolácie transakcií v databázach?

Ahojte všetci. Vladislav Rodin je v kontakte. Momentálne som vedúcim kurzu pre kurz Architekt pre vysoké pracovné zaťaženie v OTUS a tiež vediem kurzy softvérovej architektúry.

Popri vyučovaní, ako ste si mohli všimnúť, píšem originálny materiál pre blog OTUS na Habré a chcem sa zhodovať s dnešným článkom, aby sa krylo spustenie kurzu "PostgreSQL", do ktorej sa možno registrovať práve teraz.

Čo môže vyplynúť z oslabenia úrovne izolácie transakcií v databázach?

Úvod

В naposledy hovorili sme o tom, že transakcie v databázach slúžia na riešenie dvoch problémov: zabezpečenie odolnosti voči chybám a prístupu k údajom v konkurenčnom prostredí. Na úplné vykonanie týchto úloh musí mať transakcia vlastnosti ACID. Dnes budeme podrobne hovoriť o liste ja (izolácia) v tejto skratke.

Izolácie

Izolácia rieši problém prístupu k údajom v konkurenčnom prostredí a v podstate poskytuje ochranu pred rasovými podmienkami. V ideálnom prípade izolácia znamená serializáciu, čo je vlastnosť, ktorá zabezpečuje, že výsledok paralelného vykonávania transakcií je rovnaký, ako keby boli vykonávané postupne. Hlavným problémom tejto vlastnosti je, že je veľmi náročné technicky zabezpečiť a v dôsledku toho má výrazný vplyv na výkon systému. Preto sa izolácia často oslabuje, akceptuje sa riziká určitých anomálií, o ktorých bude reč nižšie. Možnosť výskytu určitých anomálií presne charakterizuje úroveň izolácie transakcií.

Najznámejšie anomálie sú: špinavé čítanie, neopakovateľné čítanie, fantómové čítanie, ale v skutočnosti je ich ešte 5: špinavý zápis, stratená aktualizácia kurzora, stratená aktualizácia, skreslenie čítania, skreslenie zápisu.

Špinavé písanie

Podstatou anomálie je, že transakcie môžu prepísať nepotvrdené údaje.

Čo môže vyplynúť z oslabenia úrovne izolácie transakcií v databázach?

Táto anomália je nebezpečná nielen preto, že údaje môžu byť v konflikte po vykonaní oboch transakcií (ako na obrázku), ale aj preto, že je narušená atomicita: keďže umožňujeme prepísanie nepotvrdených údajov, nie je jasné, ako vrátiť jednu transakciu späť bez ovplyvnenia inej. .

Anomáliu je možné ošetriť celkom jednoducho: pred spustením nahrávania pripevníme k záznamu zámok, čím zakážeme iným transakciám meniť záznam, kým sa zámok neodstráni.

Špinavé čítanie

Nečisté čítanie znamená čítanie nepotvrdených údajov.

Čo môže vyplynúť z oslabenia úrovne izolácie transakcií v databázach?

Problémy nastávajú, keď je potrebné urobiť opatrenia alebo rozhodnutia na základe vzorky.

Ak chcete opraviť anomáliu, môžete pripojiť zámok na čítanie, čo však výrazne ovplyvní výkon. Oveľa jednoduchšie je povedať, že pre transakciu vrátenia späť musí byť v systéme uložený počiatočný stav údajov (pred začiatkom zaznamenávania). Prečo nečítať odtiaľ? Je dostatočne lacné, že väčšina databáz štandardne odstraňuje nečisté čítanie.

Stratená aktualizácia

Stratená aktualizácia znamená stratené aktualizácie a preklad celkom presne odráža podstatu problému:

Čo môže vyplynúť z oslabenia úrovne izolácie transakcií v databázach?

V skutočnosti bol výsledok transakcie T2 opačný. Táto situácia môže byť opravená explicitnými alebo implicitnými zámkami zápisu. To znamená, že buď jednoducho aktualizujeme záznam a potom dôjde k implicitnému uzamknutiu, alebo vykonáme vyberte na aktualizáciu, čo spôsobí uzamknutie čítania a zápisu. Upozorňujeme, že takáto operácia je dosť nebezpečná: pri našom „nevinnom“ čítaní blokujeme ďalšie čítania. Niektoré databázy ponúkajú vyššiu bezpečnosť vybrať na zdieľanie, ktorý umožňuje čítanie údajov, ale nie ich úpravu.

Kurzor stratil aktualizáciu

Pre jemnejšie ovládanie môžu základne ponúkať ďalšie nástroje, ako napríklad kurzor. Kurzor je štruktúra, ktorá obsahuje množinu riadkov a umožňuje vám cez ne iterovať. deklarovať názov_kurzora pre príkaz select. Obsah kurzora je popísaný výberom.

Prečo potrebujete kurzor? Faktom je, že niektoré databázy ponúkajú uzamknutie všetkých záznamov vybraných výberom (stabilita čítania), alebo len záznamu, na ktorom sa práve nachádza kurzor (stabilita kurzora). So stabilitou kurzora je implementovaný krátky zámok, ktorý nám umožňuje znížiť počet zámkov, ak iterujeme veľkú vzorku údajov. Preto je anomália stratenej aktualizácie izolovaná samostatne pre kurzor.

Neopakovateľné čítanie

Neopakovateľné čítanie je, že počas vykonávania našej transakcie povedú 2 po sebe idúce čítania toho istého záznamu k rôznym výsledkom, pretože medzi tieto dve čítania zasiahla ďalšia transakcia, zmenila naše údaje a bola potvrdená.

Čo môže vyplynúť z oslabenia úrovne izolácie transakcií v databázach?

Prečo je to vôbec problém? Predstavte si, že cieľom transakcie T2 na obrázku je vybrať všetok tovar, ktorého cena je nižšia ako 150 USD. Niekto iný aktualizoval cenu na 200 dolárov. Inštalovaný filter teda nefungoval.

Tieto anomálie sa prestanú vyskytovať, keď sa pridajú dvojfázové blokovania alebo keď sa použije mechanizmus MVCC, o ktorom by som chcel diskutovať samostatne.

Fantómové čítanie

Fantóm je čítanie údajov, ktoré boli pridané inou transakciou.

Čo môže vyplynúť z oslabenia úrovne izolácie transakcií v databázach?

Ako príklad môžeme sledovať nesprávny výber najlacnejšieho produktu, kedy sa táto anomália vyskytne.

Zbaviť sa fantómového čítania je už dosť ťažké. Pravidelné blokovanie nestačí, pretože nemôžeme zablokovať niečo, čo ešte neexistuje. Systémy 2PL používajú prediktívne uzamykanie, zatiaľ čo systémy MVCC majú plánovač transakcií, ktorý vracia transakcie, ktoré môžu byť prerušené vložením. Prvý aj druhý mechanizmus sú dosť ťažké.

Čítajte šikmo

K skresleniu čítania dochádza vtedy, keď pracujeme s viacerými tabuľkami, ktorých obsah sa musí dôsledne meniť.

Povedzme, že máme tabuľky predstavujúce príspevky a ich meta informácie:

Čo môže vyplynúť z oslabenia úrovne izolácie transakcií v databázach?

Jedna transakcia číta z tabuliek, druhá ich upravuje:

Čo môže vyplynúť z oslabenia úrovne izolácie transakcií v databázach?

V dôsledku transakcie T1 má príspevok názov = Dobrý a aktualizovaný_podľa = T2, čo je určitý druh nesúladu.

V skutočnosti ide o neopakovateľné čítanie, ale ako súčasť niekoľkých tabuliek.

Aby sa to vyriešilo, T1 môže zablokovať všetky riadky, ktoré bude čítať, čo zabráni transakcii T2 zmeniť informácie. V prípade MVCC bude transakcia T2 zrušená. Ochrana proti tejto anomálii sa môže stať dôležitou, ak použijeme kurzory.

Napíšte šikmo

Túto anomáliu je tiež jednoduchšie vysvetliť na príklade: Predpokladajme, že v našom systéme by mal mať službu aspoň jeden lekár, ale obaja lekári sa rozhodli svoju službu zrušiť:

Čo môže vyplynúť z oslabenia úrovne izolácie transakcií v databázach?

Čo môže vyplynúť z oslabenia úrovne izolácie transakcií v databázach?

Anomália znamenala, že nikto z lekárov nebude v službe. Prečo sa to stalo? Pretože transakcia kontrolovala podmienku, ktorá by mohla byť porušená inou transakciou a kvôli izolácii sme túto zmenu nezaznamenali.

Ide o to isté neopakovateľné čítanie. Alternatívne môže selecty umiestniť zámky na tieto záznamy.

Skreslenie pri zápise a skreslenie pri čítaní sú kombináciami predchádzajúcich anomálií. Môžete zvážiť zošikmenie zápisu, čo je v podstate fantómové čítanie. Zvážte tabuľku, ktorá obsahuje mená zamestnancov, ich platy a projekt, na ktorom pracujú:

Čo môže vyplynúť z oslabenia úrovne izolácie transakcií v databázach?

Čo môže vyplynúť z oslabenia úrovne izolácie transakcií v databázach?

Výsledkom je nasledujúci obrázok: každý manažér si myslel, že jeho zmena nepovedie k prekročeniu rozpočtu, a tak vykonal personálne zmeny, ktoré spolu viedli k prekročeniu nákladov.

Príčina problému je úplne rovnaká ako pri fantómovom čítaní.

Závery

Uvoľnenie úrovne izolácie transakcií v databáze je kompromisom medzi bezpečnosťou a výkonom; výber tejto úrovne by sa mal pristupovať na základe potenciálnych rizík pre podnik, ak sa vyskytnú určité anomálie.

Zistite viac o kurze.

Zdroj: hab.com

Pridať komentár