ÇfarĂ« mund tĂ« ndodhi pĂ«r shkak tĂ« dobĂ«simit tĂ« nivelit tĂ« izolimit tĂ« transaksioneve nĂ« bazat e tĂ« dhĂ«nave

Përshëndetje të gjithëve. Jam Vladislav Rodin. Aktualisht, unë jam drejtues i kursit "Arkitekt i ngarkesave të larta" në OTUS, si dhe jap mësime në kurset që i kushtohen arkitekturës së softuerit.

Përveç mësimdhënies, ashtu siç e keni vënë re, unë merrem me shkruajtjen e materialeve origjinale për blogun e OTUS në Habr dhe artikulli i sotëm do ta kushtoj fillimit të kursit «PostgreSQL», për të cilin aktualisht është hapur regjistrimi.

ÇfarĂ« mund tĂ« ndodhi pĂ«r shkak tĂ« dobĂ«simit tĂ« nivelit tĂ« izolimit tĂ« transaksioneve nĂ« bazat e tĂ« dhĂ«nave

Hyrje

Në herën e kaluar Diskutuam se transaksionet në bazat e të dhënave shërbejnë për zgjidhjen e dy problemeve: sigurimin e qëndrueshmërisë dhe aksesit në të dhëna në një mjedis konkurrues. Për të realizuar plotësisht këto detyra, transaksioni duhet të ketë pronat ACID. Sot do të flasim në detaje për shkronjën I (izolim) në këtë akronim.

Izolimi

Izolimi zgjidh problemin e aksesit nĂ« tĂ« dhĂ«na nĂ« njĂ« mjedis konkurrues, duke ofruar faktikisht mbrojtje nga kushtet e garĂ«s. Idealisht, izolim do tĂ« thotĂ« serializim, domethĂ«nĂ« pronĂ«sinĂ« qĂ« siguron se rezultati i ekzekutimit tĂ« transaksioneve paralel Ă«shtĂ« i njĂ«jtĂ« si nĂ«se ato do tĂ« ekzekutoheshin radhazi. Problemi kryesor i kĂ«saj prone Ă«shtĂ« se ajo Ă«shtĂ« shumĂ« e vĂ«shtirĂ« pĂ«r t’u siguruar teknikisht dhe, si pasojĂ«, godet shumĂ« performancĂ«n e sistemit. PikĂ«risht pĂ«r kĂ«tĂ« arsye, izolimi shpesh lehtĂ«sohet, duke pranuar rreziqe tĂ« ndodhjes sĂ« disa anomali, pĂ«r tĂ« cilat do tĂ« flasim mĂ« poshtĂ«. MundĂ«sia e ndodhjes sĂ« anomali tĂ« caktuara karakterizon nivelin e izolimit tĂ« transaksioneve.

Anomalitë më të njohura janë: leximi i ndotur, leximi jo përsëritës, leximi fantazmë, por në të vërtetë ka edhe 5 të tjera: shkrimi i ndotur, humbja e kursorit të përditësimit, humbja e përditësimit, skema e leximit, skema e shkrimit.

Shkrimi i ndotur

Thelbi i anomalisĂ« Ă«shtĂ« se transaksionet mund tĂ« ri-shkruajnĂ« tĂ« dhĂ«na qĂ« s’janĂ« tĂ« angazhuara.

ÇfarĂ« mund tĂ« ndodhi pĂ«r shkak tĂ« dobĂ«simit tĂ« nivelit tĂ« izolimit tĂ« transaksioneve nĂ« bazat e tĂ« dhĂ«nave

Kjo anomali Ă«shtĂ« e rrezikshme jo vetĂ«m pĂ«r shkak se tĂ« dhĂ«nat mund tĂ« konfliktin pas angazhimit tĂ« tĂ« dy transaksioneve (siç e tregon figura), por edhe sepse bie nĂ« shkelje tĂ« atomaritetit: pasi ne lejojmĂ« tĂ« ri-shkruajmĂ« tĂ« dhĂ«na qĂ« s’janĂ« tĂ« angazhuara, nuk Ă«shtĂ« e qartĂ« se si tĂ« kthejmĂ« njĂ« transaksion, pa prekur njĂ« tĂ« tillĂ« tjetĂ«r.

Kjo anomali trajtohet mjaft thjeshtë: vendosim një bllokim për shkrim para fillimit të shkrimit, duke ndaluar transaksionet e tjera të ndryshojnë shkrimin derisa bllokimi të hiqet.

Leximi i ndotur

Leximi i ndotur do tĂ« thotĂ« leximi i tĂ« dhĂ«nave qĂ« s’janĂ« tĂ« angazhuara.

ÇfarĂ« mund tĂ« ndodhi pĂ«r shkak tĂ« dobĂ«simit tĂ« nivelit tĂ« izolimit tĂ« transaksioneve nĂ« bazat e tĂ« dhĂ«nave

Problemet shfaqen kur është e nevojshme të kryhen disa veprime ose të merren vendime mbi një mostër.

Për të korrigjuar anomalinë, mund të vendoset një bllokim për leximin, por kjo do ta godasë rëndë performancën. Më e lehtë është të thuhet se për rollback-in e transaksionit, gjendja origjinale e të dhënave (para fillimit të shkruar) duhet të ruhet në sistem. Pse të mos lexojmë nga aty? Kjo është mjaft e lirë, prandaj shumica e bazave të të dhënave e heqin leximin e papastër si standard.

Kohë e humbur

Kohë e humbur do të thotë humbje e përditësimeve, dhe përkthimi pasqyron saktësisht thelbin e problemit:

ÇfarĂ« mund tĂ« ndodhi pĂ«r shkak tĂ« dobĂ«simit tĂ« nivelit tĂ« izolimit tĂ« transaksioneve nĂ« bazat e tĂ« dhĂ«nave

Faktikisht, rezultati i transaksionit T2 u anulua. Kjo situatë mund të rregullohet me bllokime të qarta ose jo të qarta të të dhënave. Kështu që ne ose thjesht kryejmë përditësimin e të dhënave, dhe atëherë lind një bllokim i paqartë, ose ne kryejmë select for update, duke shkaktuar lindjen e një bllokimi për lexim dhe për shkruar. Vini re se kjo operacion është mjaft e rrezikshme: me leximin tonë "të pafajshëm", ne bllokojmë lexime të tjera. Disa baza ofrojnë më të sigurt select for share, që lejon leximin e të dhënave, por nuk lejon ndryshimin e tyre.

Kohë e humbur e kursorit

Për kontroll më të hollë, bazat mund të ofrojnë mjete të tjera, për shembull, kursorin. Kursor është një strukturë që përmban një set rreshtash dhe lejon të iterojë mbi to. declare cursor_name for select_statement. Përmbajtja e kursorit përshkruhet nga një select.

NĂ« çfarĂ« dobie Ă«shtĂ« kursor? Çështja Ă«shtĂ« se disa baza tĂ« tĂ« dhĂ«nave ofrojnĂ« bllokim mbi tĂ« gjitha rreshtat e zgjedhura nga select (stabiliteti i leximit), ose vetĂ«m mbi atĂ« rresht nĂ« tĂ« cilin ndodhet aktualisht kursorin (stabiliteti i kursorit). NĂ« stabilitetin e kursorit, kryhet njĂ« bllokim i shpejtĂ«, qĂ« lejon tĂ« reduktohet numri i bllokimeve nĂ« rastin kur ne iterojmĂ« mbi njĂ« mostĂ«r tĂ« madhe tĂ« tĂ« dhĂ«nave. Prandaj anomalia e kohĂ«s sĂ« humbur e veçohet pĂ«r kursorin veçmas.

Leximi i pa përsëritshëm

Leximi i pa përsëritshëm nënkupton se gjatë ekzekutimit të transaksionit tonë, 2 lexime të njëjta rreshti do të çojnë në rezultate të ndryshme, sepse një transaksion tjetër ndërhyri midis këtyre dy leximeve, ndryshoi të dhënat tona dhe u mirëprit.

ÇfarĂ« mund tĂ« ndodhi pĂ«r shkak tĂ« dobĂ«simit tĂ« nivelit tĂ« izolimit tĂ« transaksioneve nĂ« bazat e tĂ« dhĂ«nave

Pse është kjo një problem në të vërtetë? Imagjinoni se qëllimi i transaksionit T2 në imazh është të zgjedhë të gjitha produktet, çmimi i të cilave është më i vogël se 150 njësi monetare. Disa njësi të tjera e përditësuan çmimin në 200 njësi monetare. Në këtë mënyrë, filtri i vendosur nuk funksionoi.

Këto anomali ndalojnë të ndodhin kur shtohen bllokimet dypërfashëshe ose kur përdoret mekanizmi MVCC, për të cilin do të doja të flisja veçmas.

Leximi fantazmë

Leximi fantazmë quhet lexim i të dhënave që janë shtuar nga një transaksion tjetër.

ÇfarĂ« mund tĂ« ndodhi pĂ«r shkak tĂ« dobĂ«simit tĂ« nivelit tĂ« izolimit tĂ« transaksioneve nĂ« bazat e tĂ« dhĂ«nave

Si një shembull, mund të vërejmë përzgjedhjen e gabuar të produktit më të lirë kur ndodh kjo anomali.

Të heqësh dorë nga leximet fantazmë është mjaft e vështirë. Një bllokim i zakonshëm nuk është i mjaftueshëm, pasi nuk mund të bllokojmë atë që nuk ekziston akoma. Sistemet 2PL përdorin bllokim predikativ, ndërsa sistemet MVCC planifikuesi i transaksioneve anulon transaksionet që mund të dëmtohen nga shtimi. Si mekanizmi i parë ashtu edhe i dyti janë mjaft të rëndë.

Ekipi i leximit

Ekipi i leximit ndodh kur punojmë me disa tabela, përmbajtja e të cilave duhet të ndryshojë në mënyrë të koordinuar.

Supozoni që ka tabela që përfaqësojnë postimet dhe metainformacionin e tyre:

ÇfarĂ« mund tĂ« ndodhi pĂ«r shkak tĂ« dobĂ«simit tĂ« nivelit tĂ« izolimit tĂ« transaksioneve nĂ« bazat e tĂ« dhĂ«nave

Një transaksion lexon nga tabelat, tjetra i ndryshon ato:

ÇfarĂ« mund tĂ« ndodhi pĂ«r shkak tĂ« dobĂ«simit tĂ« nivelit tĂ« izolimit tĂ« transaksioneve nĂ« bazat e tĂ« dhĂ«nave

Si rezultat i ekzekutimit të transaksionit T1, në postimin titulli = Mirë, dhe updated_by = T2, që është një mosmarrëveshje e caktuar.

Në fakt, ky është një lexim i përsëritur, por midis disa tabelave.

Për ta rregulluar, T1 mund të vendosë bllokime në të gjitha rreshtat që do të lexojë, gjë që do t'i ndalojë transaksionet T2 të ndryshojnë informacionin. Në rastin e MVCC, transaksioni T2 do të anulohet. Mbrojtja nga kjo anomali mund të bëhet e rëndësishme nëse përdorim kursore.

Ekipi i shkruar

Kjo anomali gjithashtu është më e lehtë për t'u shpjeguar me një shembull: supozoni se në sistemin tonë të paktën një doktor duhet të jetë në kujdestari, por të dy doktorët vendosën të anulojnë kujdestarinë e tyre:

ÇfarĂ« mund tĂ« ndodhi pĂ«r shkak tĂ« dobĂ«simit tĂ« nivelit tĂ« izolimit tĂ« transaksioneve nĂ« bazat e tĂ« dhĂ«nave

ÇfarĂ« mund tĂ« ndodhi pĂ«r shkak tĂ« dobĂ«simit tĂ« nivelit tĂ« izolimit tĂ« transaksioneve nĂ« bazat e tĂ« dhĂ«nave

Anomalia çoi në atë që asnjë nga doktorët nuk do të dilte në kujdestari. Pse ndodhi kjo? Sepse transaksioni kontrolloi një kusht që mund të vihet në rrezik nga një transaksion tjetër, dhe për shkak të izolimit ne nuk e pamë këtë ndryshim.

Ky është në të vërtetë leximi i përsëritur. Si një variant, selektimet mund të vendosin bllokime në këto të dhëna.

Write skew dhe read skew janë kombinime të anomaliëve të mëparshme. Mund të shqyrtojmë write skew, i cili në thelb është një phantom read. Le të shqyrtojmë një tabelë që përmban emrat e punonjësve, pagat e tyre dhe projektet ku ata punojnë:

ÇfarĂ« mund tĂ« ndodhi pĂ«r shkak tĂ« dobĂ«simit tĂ« nivelit tĂ« izolimit tĂ« transaksioneve nĂ« bazat e tĂ« dhĂ«nave

ÇfarĂ« mund tĂ« ndodhi pĂ«r shkak tĂ« dobĂ«simit tĂ« nivelit tĂ« izolimit tĂ« transaksioneve nĂ« bazat e tĂ« dhĂ«nave

Në fund, ne marrim këtë pamje: çdo menaxher mendonte se ndryshimi i tij nuk do të çonte në tejkalimin e buxhetit, prandaj ata bënë ndryshime në staf, që në total rezultuan në tejkalimin e shpenzimeve.

Shkaku i shfaqjes së problemit është i njëjtë si në leximin fantom.

Përfundimet

Ushtrimi i nivelit të izolimit të transaksioneve në databazë është një kompromis midis sigurisë dhe performancës, dhe zgjedhja e këtij niveli duhet të bëhet duke marrë parasysh rreziqet potenciale për biznesin në rast të shfaqjes së anomaliëve të ndryshme.

Mëso më shumë për kursin.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster