Mida võib anda andmebaaside tehingute eraldatuse taseme nõrgenemine?

Tere kõigile. Vladislav Rodin võtab ühendust. Olen praegu OTUS-es High Workload Architect kursuse kursuse juht ja õpetan ka tarkvaraarhitektuuri kursusi.

Lisaks õpetamisele, nagu olete ehk märganud, kirjutan ma OTUSe ajaveebi jaoks originaalmaterjali Habré teemal ja tahan kattuda tänase artikliga, et see langeks kokku kursuse käivitamisega "PostgreSQL", mis on praegu registreerimiseks avatud.

Mida võib anda andmebaaside tehingute eraldatuse taseme nõrgenemine?

Sissejuhatus

В viimane kord rääkisime sellest, et tehingud andmebaasides lahendavad kahte probleemi: tõrketaluvuse ja andmetele juurdepääsu tagamine konkurentsikeskkonnas. Nende ülesannete täielikuks täitmiseks peavad tehingul olema ACID omadused. Täna räägime kirjast üksikasjalikult mina (isolatsioon) selles lühendis.

Isolatsioon

Isolatsioon lahendab konkurentsikeskkonnas andmetele juurdepääsu probleemi, pakkudes sisuliselt kaitset rassitingimuste eest. Ideaalis tähendab isoleerimine serialiseerimist, mis on omadus, mis tagab, et tehingute paralleelse täitmise tulemus on sama, kui neid sooritataks järjestikku. Selle omaduse peamine probleem on see, et seda on tehniliselt väga raske pakkuda ja seetõttu mõjutab see oluliselt süsteemi jõudlust. Seetõttu on isolatsioon sageli nõrgenenud, aktsepteerides teatud kõrvalekallete riske, mida arutatakse allpool. Teatud anomaaliate esinemise võimalus iseloomustab täpselt tehingute isoleerituse taset.

Tuntumad anomaaliad on: määrdunud lugemine, mittekorduv lugemine, fantoomlugemine, kuid tegelikult on neid veel 5: määrdunud kirjutamine, kursori värskendus kadunud, värskendus kadunud, lugemise viltu, kirjutamise viltu.

Räpane kirjutamine

Anomaalia olemus seisneb selles, et tehingud võivad sidumata andmed üle kirjutada.

Mida võib anda andmebaaside tehingute eraldatuse taseme nõrgenemine?

See anomaalia on ohtlik mitte ainult seetõttu, et andmed võivad pärast mõlema tehingu sooritamist konflikti minna (nagu pildil), vaid ka seetõttu, et rikutakse aatomilisust: kuna lubame sidumata andmeid üle kirjutada, pole selge, kuidas ühte tehingut tagasi pöörata, ilma et see mõjutaks teist tehingut. .

Anomaaliat saab käsitleda üsna lihtsalt: enne salvestamise alustamist kinnitame kirjele luku, mis keelab teistel tehingutel kirje muutmise kuni luku eemaldamiseni.

Räpane lugemine

Määrdunud lugemine tähendab sidumata andmete lugemist.

Mida võib anda andmebaaside tehingute eraldatuse taseme nõrgenemine?

Probleemid tekivad siis, kui valimi põhjal on vaja teha tegevusi või otsuseid.

Anomaalia parandamiseks võite kinnitada lugemisluku, kuid see mõjutab jõudlust oluliselt. Palju lihtsam on öelda, et tagasipööramise tehingu puhul tuleb andmete algseisund (enne salvestamise algust) süsteemi salvestada. Miks mitte sealt lugeda? See on piisavalt odav, et enamik andmebaase eemaldab vaikimisi määrdunud lugemise.

Kaotatud värskendus

Kaotatud värskendus tähendab kadunud värskendusi ja tõlge peegeldab üsna täpselt probleemi olemust:

Mida võib anda andmebaaside tehingute eraldatuse taseme nõrgenemine?

Tegelikult tühistati tehingu T2 tulemus. Seda olukorda saab parandada otsese või kaudse kirjutuslukuga. See tähendab, et me kas lihtsalt värskendame kirjet ja siis tekib kaudne lukk või teostame valige värskendamiseks, mis põhjustab lugemis- ja kirjutamisluku. Pange tähele, et selline toiming on üsna ohtlik: oma "süütu" lugemisega blokeerime muud näidud. Mõned andmebaasid pakuvad turvalisemat valige jagamiseks, mis võimaldab andmeid lugeda, kuid mitte muuta.

Kursor kaotas värskenduse

Peenema juhtimise jaoks võivad alused pakkuda muid tööriistu, näiteks kursorit. Kursor on struktuur, mis sisaldab rida ridu ja võimaldab teil neid korrata. deklareeri kursori_nimi valiku_lause jaoks. Kursori sisu kirjeldab valik.

Miks on kursorit vaja? Fakt on see, et mõned andmebaasid pakuvad lukustamist kõigile valikuga valitud kirjetele (lugemisstabiilsus) või ainult kirjele, millel kursor praegu asub (kursori stabiilsus). Kursori stabiilsusega on rakendatud lühike lukk, mis võimaldab meil vähendada lukkude arvu, kui kordame suure andmevalimiga. Seetõttu eraldatakse kadunud värskenduse anomaalia kursori jaoks eraldi.

Lugemine, mida ei saa korrata

Mittekorduv lugemine on see, et meie tehingu sooritamise ajal annavad sama kirje 2 järjestikust lugemist erinevad tulemused, kuna nende kahe lugemise vahele sekkus teine ​​tehing, muutis meie andmeid ja see pandi toime.

Mida võib anda andmebaaside tehingute eraldatuse taseme nõrgenemine?

Miks see üldse probleem on? Kujutage ette, et pildil oleva tehingu T2 eesmärk on valida kõik kaubad, mille hind on alla 150 USD. Keegi teine ​​muutis hinnaks 200 dollarit. Seega paigaldatud filter ei töötanud.

Need anomaaliad lakkavad ilmnemast kahefaasiliste blokeeringute lisamisel või MVCC mehhanismi kasutamisel, millest tahaksin eraldi rääkida.

Fantoomlugemine

Phantom on teise tehinguga lisatud andmete lugemine.

Mida võib anda andmebaaside tehingute eraldatuse taseme nõrgenemine?

Näitena võime selle kõrvalekalde ilmnemisel jälgida odavaima toote valet valikut.

Fantoomlugemistest vabanemine on juba üsna keeruline. Regulaarsest blokeerimisest ei piisa, sest me ei saa blokeerida midagi, mida veel ei eksisteeri. 2PL-süsteemid kasutavad ennustavat lukustamist, samas kui MVCC-süsteemidel on tehingute ajakava, mis tühistab tehingud, mida lisa võib häirida. Nii esimene kui ka teine ​​mehhanism on üsna rasked.

Lugemine viltu

Lugemisviga tekib siis, kui töötame mitme tabeliga, mille sisu peab järjepidevalt muutuma.

Oletame, et meil on tabelid, mis esindavad postitusi ja nende metateavet:

Mida võib anda andmebaaside tehingute eraldatuse taseme nõrgenemine?

Üks tehing loeb tabelitest, teine ​​muudab neid:

Mida võib anda andmebaaside tehingute eraldatuse taseme nõrgenemine?

Tehingu T1 tulemusena on postitusel pealkiri = Hea ja uuendatud_pool = T2, mis on omamoodi ebakõla.

Tegelikult on see mittekorratav lugemine, kuid osana mitmest tabelist.

Selle parandamiseks saab T1 lukustada kõik read, mida ta loeb, mis takistab tehingul T2 teavet muutmast. MVCC puhul T2 tehing tühistatakse. Kui kasutame kursoreid, võib selle anomaalia eest kaitsmine muutuda oluliseks.

Kirjutage viltu

Seda anomaaliat on lihtsam seletada ka näitega: oletame, et meie süsteemis peaks olema vähemalt üks arst valves, kuid mõlemad arstid otsustasid oma valvest loobuda:

Mida võib anda andmebaaside tehingute eraldatuse taseme nõrgenemine?

Mida võib anda andmebaaside tehingute eraldatuse taseme nõrgenemine?

Anomaalia tähendas, et keegi arstidest ei ole valves. Miks see juhtus? Kuna tehinguga kontrolliti tingimust, mida teine ​​tehing võib rikkuda, ja isolatsiooni tõttu me seda muudatust ei näinud.

See on sama kordumatu lugemine. Teise võimalusena saavad valitud isikud nendele kirjetele lukustada.

Kirjutamise viltu ja lugemise viltu on eelnevate kõrvalekallete kombinatsioonid. Võite kaaluda kirjutamise viltu, mis on sisuliselt fantoomlugemine. Mõelge tabelile, mis sisaldab töötajate nimesid, nende palku ja projekti, mille kallal nad töötavad:

Mida võib anda andmebaaside tehingute eraldatuse taseme nõrgenemine?

Mida võib anda andmebaaside tehingute eraldatuse taseme nõrgenemine?

Selle tulemusel saame järgmise pildi: iga juht arvas, et nende muudatus ei too kaasa eelarve ületamist, mistõttu nad tegid personalimuudatusi, mis koos tõid kaasa kulude ületamise.

Probleemi põhjus on täpselt sama, mis fantoomlugemisel.

Järeldused

Tehingute eraldatuse taseme leevendamine andmebaasis on kompromiss turvalisuse ja jõudluse vahel, selle taseme valikul tuleks lähtuda võimalikest riskidest äritegevusele teatud kõrvalekallete ilmnemisel.

Lisateavet kursuse kohta.

Allikas: www.habr.com

Lisa kommentaar