Kas gali atsirasti susilpnėjus transakcijų izoliavimo lygiui duomenų bazėse?

Sveiki visi. Vladislavas Rodinas susisiekia. Šiuo metu esu kurso vadovas didelio darbo krūvio architektų kursui OTUS, taip pat dėstau programinės įrangos architektūros kursus.

Be mokymo, kaip galbūt pastebėjote, aš rašau originalią medžiagą OTUS tinklaraščiui apie Habré ir noriu sutapti su šiandienos straipsniu, kad jis sutaptų su kurso pradžia "PostgreSQL", kuri jau dabar yra atvira registracijai.

Kas gali atsirasti susilpnėjus transakcijų izoliavimo lygiui duomenų bazėse?

įvedimas

В Paskutinį kartą kalbėjome apie tai, kad sandoriai duomenų bazėse padeda išspręsti dvi problemas: užtikrinti atsparumą gedimams ir prieigą prie duomenų konkurencinėje aplinkoje. Norint visiškai atlikti šias užduotis, operacija turi turėti ACID savybes. Šiandien mes išsamiai kalbėsime apie laišką aš (izoliacija) šioje santrumpoje.

Izoliacija

Izoliacija išsprendžia prieigos prie duomenų konkurencinėje aplinkoje problemą, iš esmės užtikrindama apsaugą nuo lenktynių sąlygų. Idealiu atveju izoliacija reiškia serializavimą, kuris yra savybė, užtikrinanti, kad lygiagrečiai vykdomų operacijų rezultatas būtų toks pat, lyg jos būtų vykdomos nuosekliai. Pagrindinė šios savybės problema yra ta, kad ją labai sunku pateikti techniškai ir dėl to daro didelę įtaką sistemos veikimui. Štai kodėl izoliacija dažnai susilpnėja, prisiimant tam tikrų anomalijų riziką, kuri bus aptarta toliau. Tam tikrų anomalijų atsiradimo galimybė tiksliai apibūdina sandorio izoliacijos lygį.

Labiausiai žinomos anomalijos yra šios: purvinas skaitymas, nepakartojamas skaitymas, fantominis skaitymas, bet iš tikrųjų yra dar 5: purvinas rašymas, žymeklio atnaujinimas pamestas, atnaujinimas prarastas, skaitymo kreivumas, rašymo iškrypimas.

Nešvarus rašymas

Anomalijos esmė ta, kad operacijos gali perrašyti neįpareigotus duomenis.

Kas gali atsirasti susilpnėjus transakcijų izoliavimo lygiui duomenų bazėse?

Ši anomalija pavojinga ne tik dėl to, kad atlikus abi operacijas duomenys gali konfliktuoti (kaip paveikslėlyje), bet ir dėl to, kad pažeidžiamas atomiškumas: kadangi leidžiame perrašyti neįsipareigotus duomenis, neaišku, kaip atšaukti vieną operaciją nepažeidžiant kitos. .

Anomaliją galima gydyti gana paprastai: prieš pradėdami įrašymą prie įrašo pritvirtiname užraktą, uždraudžiame kitoms operacijoms keisti įrašą, kol užraktas nebus pašalintas.

Purvinas skaitymas

Nešvarus skaitymas reiškia neįsipareigotų duomenų skaitymą.

Kas gali atsirasti susilpnėjus transakcijų izoliavimo lygiui duomenų bazėse?

Problemos kyla tada, kai reikia imtis veiksmų ar priimti sprendimus remiantis imtimi.

Norėdami ištaisyti anomaliją, galite pritvirtinti skaitymo užraktą, tačiau tai labai paveiks našumą. Daug paprasčiau pasakyti, kad norint atšaukti operaciją, sistemoje turi būti išsaugota pradinė duomenų būsena (prieš įrašymo pradžią). Kodėl neskaitai iš ten? Tai pakankamai nebrangi, kad dauguma duomenų bazių pašalina nešvarų skaitymą pagal numatytuosius nustatymus.

Prarastas atnaujinimas

Prarastas naujinimas reiškia prarastus naujinimus, o vertimas gana tiksliai atspindi problemos esmę:

Kas gali atsirasti susilpnėjus transakcijų izoliavimo lygiui duomenų bazėse?

Tiesą sakant, sandorio T2 rezultatas buvo atšauktas. Šią situaciją galima ištaisyti naudojant tiesioginius arba numanomus rašymo užraktus. Tai yra, mes arba tiesiog atnaujiname įrašą, tada įvyksta numanomas užraktas, arba atliekame pasirinkite atnaujinimui, sukeldamas skaitymo ir rašymo užraktą. Atkreipkite dėmesį, kad tokia operacija yra gana pavojinga: savo „nekaltu“ skaitymu blokuojame kitus rodmenis. Kai kurios duomenų bazės siūlo saugesnę pasirinkite dalintis, leidžiančius duomenis skaityti, bet ne keisti.

Žymeklis prarado atnaujinimą

Tikslesniam valdymui duomenų bazės gali pasiūlyti kitus įrankius, pvz., žymeklį. Žymeklis yra struktūra, turinti eilučių rinkinį ir leidžianti jas kartoti. deklaruoti žymeklio_pavadinimą pasirinkimo_teiginiui. Žymeklio turinys aprašomas pasirinkimu.

Kodėl jums reikia žymeklio? Faktas yra tas, kad kai kurios duomenų bazės siūlo užrakinti visus įrašus, pasirinktus pasirinkus (skaitymo stabilumas), arba tik įrašą, kuriame šiuo metu yra žymeklis (žymeklio stabilumas). Naudojant žymeklio stabilumą, įdiegtas trumpas užraktas, kuris leidžia sumažinti užraktų skaičių, jei kartojame didelę duomenų pavyzdį. Todėl prarasta naujinimo anomalija žymekliui išskiriama atskirai.

Nepakartojamas skaitymas

Nepakartojamas skaitymas yra tai, kad mūsų operacijos metu 2 to paties įrašo nuskaitymai iš eilės duos skirtingus rezultatus, nes tarp šių dviejų nuskaitymų įsikišo kita operacija, pakeitė mūsų duomenis ir buvo įvykdyta.

Kas gali atsirasti susilpnėjus transakcijų izoliavimo lygiui duomenų bazėse?

Kodėl tai net problema? Įsivaizduokite, kad paveikslėlyje T2 operacijos tikslas yra atrinkti visas prekes, kurių kaina mažesnė nei 150 USD. Kažkas kitas atnaujino kainą iki 200 USD. Taigi sumontuotas filtras neveikė.

Šios anomalijos nustoja atsirasti, kai pridedami dviejų fazių blokavimai arba kai naudojamas MVCC mechanizmas, kurį norėčiau aptarti atskirai.

Fantominis skaitymas

„Phantom“ yra duomenų, pridėtų atliekant kitą operaciją, skaitymas.

Kas gali atsirasti susilpnėjus transakcijų izoliavimo lygiui duomenų bazėse?

Kaip pavyzdį galime pastebėti neteisingą pigiausios prekės pasirinkimą, kai atsiranda ši anomalija.

Atsikratyti fantominių skaitymų jau gana sunku. Reguliariai blokuoti neužtenka, nes negalime užblokuoti to, ko dar nėra. 2PL sistemos naudoja nuspėjamą užrakinimą, o MVCC sistemos turi operacijų planavimo priemonę, kuri atšaukia operacijas, kurias gali sutrikdyti įdėklas. Tiek pirmasis, tiek antrasis mechanizmai yra gana sunkūs.

Skaityti kreivai

Skaitymo iškrypimas atsiranda, kai dirbame su keliomis lentelėmis, kurių turinys turi nuosekliai keistis.

Tarkime, kad turime lenteles, vaizduojančias įrašus ir jų metainformaciją:

Kas gali atsirasti susilpnėjus transakcijų izoliavimo lygiui duomenų bazėse?

Viena operacija nuskaitoma iš lentelių, kita jas keičia:

Kas gali atsirasti susilpnėjus transakcijų izoliavimo lygiui duomenų bazėse?

Dėl operacijos T1 įrašo pavadinimas = geras, o atnaujintas_ = T2, o tai yra tam tikras neatitikimas.

Tiesą sakant, tai yra nepakartojamas skaitymas, bet kaip kelių lentelių dalis.

Norėdami tai ištaisyti, T1 gali užrakinti visas eilutes, kurias jis skaitys, o tai neleis T2 operacijai pakeisti informacijos. MVCC atveju T2 sandoris bus atšauktas. Apsauga nuo šios anomalijos gali tapti svarbia, jei naudosime žymeklius.

Rašyti kreivai

Šią anomaliją taip pat lengviau paaiškinti pavyzdžiu: tarkime, kad mūsų sistemoje turėtų budėti bent vienas gydytojas, tačiau abu gydytojai nusprendė atšaukti savo budėjimą:

Kas gali atsirasti susilpnėjus transakcijų izoliavimo lygiui duomenų bazėse?

Kas gali atsirasti susilpnėjus transakcijų izoliavimo lygiui duomenų bazėse?

Anomalija reiškė, kad nė vienas iš gydytojų nebudės. Kodėl taip atsitiko? Kadangi sandoryje buvo tikrinama sąlyga, kurią galėjo pažeisti kita operacija, ir dėl izoliacijos šio pakeitimo nepastebėjome.

Tai tas pats nepakartojamas skaitymas. Arba pasirinktinai gali užrakinti šiuos įrašus.

Rašymo pasvirimas ir skaitymo kreivumas yra ankstesnių anomalijų deriniai. Galite apsvarstyti rašymo pasvirimą, kuris iš esmės yra fantominis skaitymas. Apsvarstykite lentelę, kurioje yra darbuotojų vardai, jų atlyginimai ir projektas, su kuriuo jie dirba:

Kas gali atsirasti susilpnėjus transakcijų izoliavimo lygiui duomenų bazėse?

Kas gali atsirasti susilpnėjus transakcijų izoliavimo lygiui duomenų bazėse?

Dėl to gauname tokį vaizdą: kiekvienas vadovas manė, kad dėl jų pakeitimo nebus viršytas biudžetas, todėl jie atliko personalo pakeitimus, kurie kartu lėmė išlaidų viršijimą.

Problemos priežastis lygiai tokia pati kaip ir fantominio skaitymo.

išvados

Sandorių izoliacijos lygio sušvelninimas duomenų bazėje yra kompromisas tarp saugumo ir našumo; šio lygio pasirinkimas turėtų būti vertinamas atsižvelgiant į galimą riziką verslui, jei atsiranda tam tikrų anomalijų.

Sužinokite daugiau apie kursą.

Šaltinis: www.habr.com

Добавить комментарий