Transakcie a ich kontrolné mechanizmy

Transakcie

Transakcia je postupnosť operácií s údajmi, ktorá má začiatok a koniec.

Transakcia je postupné vykonávanie operácií čítania a zápisu. Koniec transakcie môže byť buď uložením zmien (commit) alebo zrušením zmien (rollback). Vo vzťahu k databáze transakcia pozostáva z niekoľkých požiadaviek, ktoré sa považujú za jednu požiadavku.

Transakcie musia spĺňať vlastnosti ACID

Atomicita. Transakcia je buď dokončená úplne, alebo nie je dokončená vôbec.

Dôslednosť. Pri dokončení transakcie nesmú byť porušené obmedzenia kladené na údaje (napríklad obmedzenia v databáze). Konzistentnosť znamená, že systém sa prenesie z jedného správneho stavu do iného správneho stavu.

Izolácia. Súbežne prebiehajúce transakcie by sa nemali navzájom ovplyvňovať, napríklad meniť údaje používané inou transakciou. Výsledok vykonávania paralelných transakcií by mal byť rovnaký, ako keby boli transakcie vykonávané postupne.

Udržateľnosť. Po vykonaní zmien by sa nemali stratiť.

Denník transakcií

Log uchováva zmeny uskutočnené transakciami, zabezpečuje atomickosť a stabilitu dát v prípade zlyhania systému

Protokol obsahuje hodnoty, ktoré mali údaje pred a po zmene transakciou. Stratégia zápisu vopred vyžaduje pridanie záznamu denníka o predchádzajúcich hodnotách pred začiatkom a o konečných hodnotách po dokončení transakcie. V prípade náhleho zastavenia systému databáza načíta protokol v opačnom poradí a zruší zmeny vykonané transakciami. Po zistení prerušenej transakcie ju databáza vykoná a vykoná zmeny v protokole. Keďže je databáza v stave v čase zlyhania, načítava protokol v doprednom poradí a vráti zmeny vykonané transakciami. Týmto spôsobom sa zachová stabilita transakcií, ktoré už boli potvrdené, a atomicita prerušenej transakcie.

Jednoduché opätovné vykonanie neúspešných transakcií na obnovu nestačí.

Príklad. Používateľ má na účte 500 dolárov a používateľ sa rozhodne vybrať si ich z bankomatu. Prebiehajú dve transakcie. Prvý načíta hodnotu zostatku a ak je na zostatku dostatok prostriedkov, vydá peniaze používateľovi. Druhý odpočíta požadovanú sumu od zostatku. Povedzme, že systém spadol a prvá operácia zlyhala, ale druhá áno. V tomto prípade nemôžeme používateľovi znovu vydať peniaze bez toho, aby sme systém vrátili do pôvodného stavu s kladným zostatkom.

Úrovne izolácie

Prečítajte si Odovzdané

Problém špinavého čítania spočíva v tom, že transakcia môže čítať medzivýsledok inej transakcie.

Príklad. Počiatočná hodnota zostatku je 0 USD. T1 pridá k vášmu zostatku 50 USD. T2 prečíta hodnotu zostatku (50 USD). T1 zahodí zmeny a ukončí sa. T2 pokračuje vo vykonávaní s nesprávnymi údajmi o zostatku.

Riešením je čítanie fixných dát (Read Committed), ktoré zakazuje čítanie dát zmenených transakciou. Ak transakcia A zmenila určitý súbor údajov, potom je transakcia B pri prístupe k týmto údajom nútená čakať na dokončenie transakcie A.

Opakovateľné čítanie

Problém so stratou aktualizácií. T1 ukladá zmeny nad zmeny T2.

Príklad. Počiatočná hodnota zostatku je 0 USD a dve transakcie súčasne dopĺňajú zostatok. T1 a T2 čítajú zostatok 0 USD. T2 potom pridá 200 USD k 0 USD a uloží výsledok. T1 pridá 100 $ k 0 $ a uloží výsledok. Konečný výsledok je 100 USD namiesto 300 USD.

Neopakovateľný problém s čítaním. Opakované čítanie rovnakých údajov vráti rôzne hodnoty.

Príklad. T1 číta hodnotu zostatku 0 USD. T2 potom pridá 50 USD k zostatku a skončí. T1 znova načíta údaje a zistí nesúlad s predchádzajúcim výsledkom.

Opakovateľné čítanie zaisťuje, že druhé čítanie vráti rovnaký výsledok. Údaje načítané jednou transakciou nemožno zmeniť v iných, kým sa transakcia nedokončí. Ak transakcia A prečítala určitý súbor údajov, potom je transakcia B pri prístupe k týmto údajom nútená čakať na dokončenie transakcie A.

Objednané čítanie (serializovateľné)

Problém s fantómovým čítaním. Dva dotazy, ktoré vyberajú údaje na základe určitej podmienky, vracajú rôzne hodnoty.

Príklad. T1 požaduje počet všetkých používateľov, ktorých zostatok je vyšší ako 0 USD, ale nižší ako 100 USD. T2 odpočíta 1 $ od používateľa so zostatkom 101 $. T1 znova odošle žiadosť.

Objednané čítanie (serializovateľné). Transakcie sa vykonávajú ako úplne sekvenčné. Je zakázané aktualizovať alebo pridávať záznamy, ktoré spadajú do podmienok požiadavky. Ak transakcia A vyžaduje údaje z celej tabuľky, potom sa celá tabuľka zmrazí pre ostatné transakcie, kým sa transakcia A nedokončí.

Plánovač

Nastavuje poradie, v ktorom sa majú operácie vykonávať počas paralelných transakcií.

Poskytuje špecifikovanú úroveň izolácie. Ak výsledok operácií nezávisí od ich poradia, potom sú takéto operácie komutatívne (Permutable). Operácie čítania a operácie s rôznymi údajmi sú komutatívne. Operácie čítania, zápisu a zápisu nie sú komutatívne. Úlohou plánovača je prekladať operácie vykonávané paralelnými transakciami tak, aby výsledok vykonania bol ekvivalentný postupnému vykonávaniu transakcií.

Mechanizmy na riadenie paralelných úloh (Concurrency Control)

Optimistický je založený na odhaľovaní a riešení konfliktov, pesimistický na predchádzaní vzniku konfliktov.

V optimistickom prístupe má viacero používateľov k dispozícii kópie údajov. Prvá osoba, ktorá dokončí úpravy, uloží zmeny, zatiaľ čo ostatní musia zmeny zlúčiť. Optimistický algoritmus umožňuje konflikt, ale systém sa musí z konfliktu zotaviť.

Pri pesimistickom prístupe prvý používateľ, ktorý zachytí údaje, bráni ostatným v prijímaní údajov. Ak sú konflikty zriedkavé, je rozumné zvoliť optimistickú stratégiu, pretože poskytuje vyššiu úroveň súbežnosti.

Zamykanie

Ak má jedna transakcia zamknuté údaje, ostatné transakcie musia pri prístupe k údajom počkať, kým sa odomknú.

Blok môže byť prekrytý databázou, tabuľkou, riadkom alebo atribútom. Zdieľaný zámok môže byť uložený na rovnaké údaje niekoľkými transakciami, umožňuje čítanie všetkých transakcií (vrátane tej, ktorá ho nariadila), zakazuje modifikáciu a exkluzívne zachytávanie. Exkluzívny zámok môže byť uložený iba jednou transakciou, povoľuje akékoľvek akcie ukladajúcej transakcie, zakazuje akékoľvek akcie ostatných.

Uviaznutie je situácia, keď transakcie skončia v nevybavenom stave, ktorý trvá neurčito.

Príklad. Prvá transakcia čaká na uvoľnenie údajov zachytených druhou, zatiaľ čo druhá čaká na uvoľnenie údajov zachytených prvou transakciou.

Optimistické riešenie problému zablokovania umožňuje, aby došlo k zablokovaniu, ale potom obnoví systém vrátením jednej z transakcií zapojených do zablokovania.

V určitých intervaloch sa hľadajú uviaznutia. Jednou z metód detekcie je podľa času, to znamená, že ak transakcia trvá príliš dlho, došlo k zablokovaniu. Keď sa nájde zablokovanie, jedna z transakcií sa vráti späť, čo umožní dokončenie ostatných transakcií zapojených do zablokovania. Výber obete môže byť založený na hodnote transakcií alebo ich seniorite (schémy Wait-Die a Wound-wait).

Každá transakcia T je pridelená časová pečiatka TS obsahujúci čas začiatku transakcie.

Počkaj-zomri.

Ak TS (Ti) < TS(Tj), Potom Ti čaká, inak Ti vráti späť a začne znova s ​​rovnakou časovou pečiatkou.

Ak mladá transakcia získala zdroj a staršia transakcia požaduje rovnaký zdroj, potom môže staršia transakcia čakať. Ak staršia transakcia získala zdroj, potom bude mladšia transakcia požadujúca tento zdroj vrátená späť.

Rana-čakaj.

Ak TS (Ti) < TS(Tj), Potom Tj sa vráti späť a začne znova s ​​rovnakou časovou pečiatkou, inak Ti čakanie.

Ak mladšia transakcia získala zdroj a staršia transakcia požaduje rovnaký zdroj, mladšia transakcia bude vrátená späť. Ak staršia transakcia získala zdroj, potom mladšia transakcia požadujúca tento zdroj môže čakať. Výber obetí na základe priority zabraňuje zablokovaniu, ale vráti transakcie, ktoré nie sú zablokované. Problém je v tom, že transakcie možno mnohokrát vrátiť späť, pretože... staršia transakcia môže držať zdroj na dlhú dobu.

Pesimistické riešenie problému zablokovania neumožňuje, aby sa transakcia začala vykonávať, ak existuje riziko zablokovania.

Na detekciu mŕtveho bodu sa zostrojí graf (čakací graf, wait-for-graph), ktorého vrcholmi sú transakcie a hrany smerujú z transakcií čakajúcich na uvoľnenie dát k transakcii, ktorá tieto dáta zachytila. Za zablokovanie sa považuje, ak má graf slučku. Vytvorenie čakacieho grafu, najmä v distribuovaných databázach, je nákladný postup.

Dvojfázové uzamykanie – zabraňuje zablokovaniu tým, že na začiatku transakcie zabaví všetky zdroje použité pri transakcii a na konci ich uvoľní

Všetky blokovacie operácie musia predchádzať prvému odblokovaniu. Má dve fázy – Rastúcu fázu, počas ktorej sa úchopy hromadia, a fázu zmršťovania, počas ktorej sa úchopy uvoľňujú. Ak nie je možné získať jeden zo zdrojov, transakcia sa začne odznova. Je možné, že transakcia nebude schopná získať požadované zdroje, napríklad ak niekoľko transakcií súťaží o rovnaké zdroje.

Dvojfázové odovzdanie zaisťuje, že potvrdenie sa vykoná na všetkých replikách databázy

Každá databáza zapíše do logu informácie o údajoch, ktoré sa budú meniť a odpovedá koordinátorovi OK (Fáza hlasovania). Keď všetci odpovedali OK, koordinátor vyšle signál, ktorý každého zaviaže, aby sa zaviazal. Po potvrdení servery odpovedajú OK, ak aspoň jeden neodpovedá OK, potom koordinátor pošle signál na zrušenie zmien všetkým serverom (Fáza dokončenia).

Metóda časovej pečiatky

Staršia transakcia sa vráti späť pri pokuse o prístup k údajom zahrnutým v mladšej transakcii

Ku každej transakcii je priradená časová pečiatka TS zodpovedajúcemu času začiatku vykonávania. Ak Ti senior Tj, Potom TS (Ti) < TS(Tj).

Keď sa transakcia vráti späť, priradí sa jej nová časová pečiatka. Každý dátový objekt Q zapojené do transakcie je označené dvoma štítkami. W-TS(Q) — časová pečiatka najmladšej transakcie, ktorá úspešne dokončila záznam cez Q. R-TS(Q) — časová pečiatka najmladšej transakcie, ktorá vykonala záznam čítania Q.

Pri transakcii T žiadosti o čítanie údajov Q Sú dve možnosti.

Ak TS(T) < W-TS(Q), to znamená, že údaje boli aktualizované mladšou transakciou, potom transakciou T prevráti späť.

Ak TS(T) >= W-TS(Q), potom sa vykoná čítanie a R-TS(Q) sa stáva MAX(R-TS(Q), TS(T)).

Pri transakcii T požaduje zmeny údajov Q Sú dve možnosti.

Ak TS(T) < R-TS(Q), to znamená, že údaje už boli načítané mladšou transakciou a ak dôjde k zmene, dôjde ku konfliktu. Transakcia T prevráti späť.

Ak TS(T) < W-TS(Q), to znamená, že transakcia sa pokúsi prepísať novšiu hodnotu, transakcia T sa vráti späť. V ostatných prípadoch sa zmena vykonáva a W-TS(Q) sa stáva rovnocenným TS(T).

Nie je potrebná žiadna drahá konštrukcia čakacieho grafu. Staršie transakcie závisia od novších, takže v čakacom grafe nie sú žiadne cykly. Neexistujú žiadne uviaznutia, pretože transakcie sa nečakajú, ale okamžite sa vrátia späť. Kaskádové vrátenie je možné. Ak Ti odvalil sa a Tj Prečítal som si údaje, ktoré som zmenil Ti, Potom Tj mali tiež vrátiť späť. Ak v rovnakom čase Tj už bol spáchaný, potom dôjde k porušeniu princípu stability.

Jedno z riešení kaskádových rollbackov. Transakcia dokončí všetky operácie zápisu na konci a ostatné transakcie musia čakať na dokončenie tejto operácie. Transakcie pred čítaním čakajú na potvrdenie.

Thomas write rule - variácia metódy časovej pečiatky, v ktorej je zakázané prepisovať dáta aktualizované mladšou transakciou staršou.

Transakcia T požaduje zmeny údajov Q, ak TS(T) < W-TS(Q), to znamená, že transakcia sa pokúša prepísať novšiu hodnotu, transakcia T nie je vrátená späť ako pri metóde časovej pečiatky.

Zdroj: hab.com

Pridať komentár