Millele vÔib viia tehingute eraldusvÔime nÔrgendamine andmebaasides

Tere kÔigile. Siin on Vladislav Rodin. Praegu olen ma kursuse "Suure koormuse arhitekt" juht OTUSes, samuti Ôpetan tarkvaraarhitektuuri kursustel.

Lisaks Ă”petamisele, nagu olete vĂ”ib-olla mĂ€rganud, kirjutan ma OTUSi blogisse autorimaterjali ja tĂ€na tahan ma artikli pĂŒhendada kursuse kĂ€ivitamisele «PostgreSQL», millele on praegu avatud registreerimine.

Millele vÔib viia tehingute eraldusvÔime nÔrgendamine andmebaasides

Sissejuhatus

Uues eelmine kord Me oleme rÀÀkinud sellest, et andmebaasides toimuvad tehingud lahendavad kahte ĂŒlesannet: tagavad talitlushĂ€irete talumise ja andmete ligipÀÀsu konkurentsikeskkonnas. Et neid ĂŒlesandeid tĂ€ita, peab tehing omama ACID omadusi. TĂ€na rÀÀgime me pĂ”hjalikult tĂ€hest I (isolatsioon) selles akronĂŒĂŒmis.

Isolatsioon

Isolatsioon lahendab probleemi andmete ligipÀÀsust konkurentsikeskkonnas, pakkudes tegelikult kaitset race condition'ide eest. Ideaalis tĂ€hendab isolatsioon serialiseerimist, ehkki omadust, mis tagab, et tehingute samaaegne tĂ€itmine on sama, nagu kui need tĂ€idetaks jĂ€rjestikku. Peamine probleem selle omaduse juures on see, et seda on vĂ€ga keeruline tehniliselt tagada ja seetĂ”ttu mĂ”jutab see tugevalt sĂŒsteemi jĂ”udlust. SeepĂ€rast nĂ”rgestatakse isolatsiooni sageli, vĂ”ttes riske teatud anomaaliate tekkeks, millest allpool rÀÀgime. Teatud anomaaliate tekkimise vĂ”imalus iseloomustabki tehingute isolatsiooni taset.

KÔigist tuntumatest anomaaliatest on: dirty read, non-repeatable read, phantom read, kuid tegelikult on neid veel 5: dirty write, cursor lost update, lost update, read skew, write skew.

Dirty write

Anomaalia olemus seisneb selles, et tehingud vĂ”ivad kirjutada kinnitamata andmeid ĂŒle.

Millele vÔib viia tehingute eraldusvÔime nÔrgendamine andmebaasides

See anomaalia on ohtlik mitte ainult selle poolest, et andmed vĂ”ivad pĂ€rast mĂ”lema tehingu kinnitamist konflikti sattuda (nagu pildil), vaid ka seetĂ”ttu, et rikutakse aatomilisust: kuna me lubame kinnitamata andmete ĂŒmberkirjutamise, siis ei ole selge, kuidas tagada ĂŒhe tehingu tagasivĂ”tmine, rikkumata samal ajal teist.

Anomaalia lahendamine on ĂŒsna lihtne: paneme kirjutamisele lukustuse enne kirjutamise alustamist, keelates teistel tehingutel ĂŒlesande muutmise, kuni lukustust ei eemaldata.

Dirty read

Dirty read tÀhendab kinnitamata andmete lugemist.

Millele vÔib viia tehingute eraldusvÔime nÔrgendamine andmebaasides

Probleemid tekivad siis, kui valimi pÔhjal tuleb teha toiminguid vÔi otsuseid.

Anomaalia parandamiseks saab lukustada lugemise, kuid see mĂ”jutab oluliselt jĂ”udlust. Palju lihtsam on öelda, et tehingu tagasiviimiseks (rollback) peab algne andmeolek (enne kirjutamist) olema sĂŒsteemis salvestatud. Miks mitte lugeda sealt? See on piisavalt odav, seega enamiku andmebaaside vaike seadistuses on dirty read lihtsalt eemaldatud.

Kadunud vÀrskendus

Kadunud vĂ€rskendus tĂ€histab kadunud vĂ€rskendusi ja see tĂ”lge peegeldab probleemi olemust ĂŒsna tĂ€pselt:

Millele vÔib viia tehingute eraldusvÔime nÔrgendamine andmebaasides

Tegelikult tĂŒhistati tehingu T2 tulemus. Selline olukord lahendatakse selgete vĂ”i mitte-selgete kirjalukudega. See tĂ€hendab, et kas me lihtsalt uuendame kirjet, ja siis tekib mitte-selge lukutus, vĂ”i sooritame select for update, pĂ”hjustades lugemise ja kirjutamise lukustamise loomist. Pange tĂ€hele, et selline operatsioon on piisavalt ohtlik: oma "kahjutuga" lugemisega lukustame me teised lugemised. MĂ”ned andmebaasid pakuvad turvalisemat select for share, mis vĂ”imaldab andmeid lugeda, kuid ei luba neid muuta.

Kursori kadunud vÀrskendus

TÀpsema kontrolli jaoks vÔivad andmebaasid pakkuda muid tööriistu, nÀiteks kursoreid. Kursor on struktuur, mis sisaldab ridade kogumit ja vÔimaldab neist iteratsiooni. declare cursor_name for select_statement. Kursorirealiskivid on kirjeldatud selectiga.

Miks on kursor vajalik? Asi on selles, et mĂ”ned andmebaasid pakuvad lukustamist kĂ”ikidele ridadele, mis on valitud selectiga (read stability), vĂ”i ainult sellele real, kus kursor asub (cursor stability). Kursoristabiilsuse korral toimub lĂŒhiajaline lukustus, mis aitab vĂ€hendada lukustuste arvu, kui me iteratsiooni teeme suure valiku andmetega. SeetĂ”ttu tuuakse kadunud vĂ€rskendus probleemi jaokskursori puhul esile eraldi.

Mitte-korduvalt loetud

Mitte-korduv lugemine seisneb selles, et meie tehingu kÀivitamise ajal toob kahe jÀrjestikuse sama kirje lugemine kaasa erinevaid tulemusi, kuna teine tehing sekkus nende kahe lugemise vahel, muutis meie andmeid ja tehti kinnitatud.

Millele vÔib viia tehingute eraldusvÔime nÔrgendamine andmebaasides

Miks see ĂŒldse probleem on? Kujutage ette, et transaktsiooni T2 eesmĂ€rk on valida kĂ”ik tooted, mille hind on madalam kui 150 eurot. Keegi teine muutis hinna 200 euro peale. Nii et kehtestatud filter ei tööta.

Need anomaaliad lakkavad esinemast, kui lisatakse kahefasaalsed lukud vÔi kasutatakse MVCC mehhanismi, millest sooviksin eraldi rÀÀkida.

Fantoomlugemine

Fantoomlugemine on andmete lugemine, mis on lisatud teise transaktsiooni poolt.

Millele vÔib viia tehingute eraldusvÔime nÔrgendamine andmebaasides

NÀiteks vÔib tÀheldada vale kÔige odavama toote valikut, kui see aken esineb.

Fantoomlugemistest vabanemine on juba piisavalt keeruline. Tavaline lukustus ei ole piisav, kuna ei saa lukustada seda, mida veel ei ole. 2PL-sĂŒsteemid kasutavad predikatiivset lukustamist, samas kui MVCC-sĂŒsteemides tĂŒhistab tehingute planeerija need transaktsioonid, mida vĂ”ib rikkuda lisamine. MĂ”lemad mehhanismid on piisavalt suured.

Lugemissegu

Lugemissegu tekib, kui töötame mitme tabeliga, mille sisu peab muutuma jÀrjepidevalt.

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

Millele vÔib viia tehingute eraldusvÔime nÔrgendamine andmebaasides

Üks transaktsioon loeb tabelitest, teine muudab neid:

Millele vÔib viia tehingute eraldusvÔime nÔrgendamine andmebaasides

Transaktsiooni T1 tÀitmise tulemuseks on, et postituse pealkiri on Good ja updated_by = T2, mis on mingisugune vastuolu.

Tegelikult on see non-repeatable read, kuid mitme tabeli osas.

Korrekteerimiseks vĂ”ib T1 panna lukud kĂ”ikidele ridadele, mida ta kavatseb lugeda, mis ei lase transaktsioonil T2 teavet muuta. MVCC puhul tĂŒhistatakse transaktsioon T2. Selle anomaalia kaitsmine vĂ”ib muutuda oluliseks, kui kasutame kursorit.

Kirjutamissegu

Seda anomaaliat on lihtsam seletada nĂ€ite kaudu: oletame, et meie sĂŒsteemis peab vĂ€hemalt ĂŒks arst olema valves, kuid mĂ”lemad arstid otsustasid oma valve Ă€ra jĂ€tta:

Millele vÔib viia tehingute eraldusvÔime nÔrgendamine andmebaasides

Millele vÔib viia tehingute eraldusvÔime nÔrgendamine andmebaasides

Anomaalia viis selleni, et mitte ĂŒkski arst ei tule valvele. Miks see juhtus? Kuna transaktsioon kontrollis tingimust, mida vĂ”is rikuda teine transaktsioon, ja eraldatuse tĂ”ttu me seda muudatust ei nĂ€inud.

See on sama non-repeatable read. Alternatiivina vÔivad select'id panna lukud nendele kirjadele.

Write skew ja read skew on eelnevaid anomaaliaid kombineerivad nÀhtused. VÔime vaadata write skew'i, mis on sisuliselt phantom read. Vaatame tabelit, kus on töötajate nimed, nende palgad ja projekt, millega nad tegelevad:

Millele vÔib viia tehingute eraldusvÔime nÔrgendamine andmebaasides

Millele vÔib viia tehingute eraldusvÔime nÔrgendamine andmebaasides

LĂ”ppkokkuvĂ”ttes saame jĂ€rgmise pildi: iga juht arvas, et tema muudatus ei vii eelarvest kĂ”rvale, seega tegid nad kadude muudatused, mis kokku viisid ĂŒlelaekumisele.

Probleemi teke on tÀpselt sama, mis phantom read'i puhul.

JĂ€reldused

Andmebaasi tehingute isoleerimise taseme nÔrgenemine on kompromiss ohutuse ja jÔudluse vahel; selle taseme valimisel tuleb arvestada ettevÔtte potentsiaalsete riskidega, mis tekivad teatud anomaaliate korral.

Tutvu kursusega lÀhemalt.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster