Tehingud ja nende kontrollimehhanismid

Tehingud

Tehing on andmetega tehtavate toimingute jada, millel on algus ja lÔpp.

Tehing on lugemis- ja kirjutamisoperatsioonide jĂ€rjestikune tĂ€itmine. Tehingu lĂ”pp vĂ”ib olla kas muudatuste salvestamine (commit) vĂ”i muudatuste tĂŒhistamine (tagasiminek). Andmebaasi puhul koosneb tehing mitmest pĂ€ringust, mida kĂ€sitletakse ĂŒhe pĂ€ringuna.

Tehingud peavad vastama ACID-i omadustele

Aatomilisus. Tehing lĂ”petatakse tĂ€ielikult vĂ”i ĂŒldse mitte.

JĂ€rjepidevus. Tehingu sooritamisel ei tohi rikkuda andmetele seatud piiranguid (nĂ€iteks piiranguid andmebaasis). JĂ€rjepidevus tĂ€hendab, et sĂŒsteem viiakse ĂŒhest Ă”igest olekust teise Ă”igesse olekusse.

Isolatsioon. Paralleelselt toimuvad tehingud ei tohiks ĂŒksteist mĂ”jutada, nĂ€iteks muuta teise tehingu kasutatavaid andmeid. Paralleelsete tehingute sooritamise tulemus peaks olema sama, nagu oleks tehingud sooritatud jĂ€rjestikku.

JĂ€tkusuutlikkus. Kord tehtud muudatused ei tohiks kaotada.

Tehingute logi

Logi salvestab tehingutest tehtud muudatused, tagab andmete aatomilisuse ja stabiilsuse sĂŒsteemirikke korral

Logi sisaldab vÀÀrtusi, mis andmetel olid enne ja pĂ€rast tehingu muutmist. Ettekirjutamise logistrateegia nĂ”uab logikirje lisamist eelmiste vÀÀrtuste kohta enne algust ja lĂ”ppvÀÀrtuste kohta pĂ€rast tehingu lĂ”petamist. SĂŒsteemi Ă€kilise seiskumise korral loeb andmebaas logi vastupidises jĂ€rjekorras ja tĂŒhistab tehingutega tehtud muudatused. PĂ€rast katkenud tehingut kĂ€ivitab andmebaas selle ja teeb selle kohta muudatusi logis. Olles tĂ”rke hetkel olekus, loeb andmebaas logi edasises jĂ€rjekorras ja tagastab tehingutega tehtud muudatused. Nii sĂ€ilib juba sooritatud tehingute stabiilsus ja katkenud tehingu atomaalsus.

EbaÔnnestunud tehingute lihtsalt uuesti tÀitmisest taastamiseks ei piisa.

NĂ€ide: Kasutaja kontol 500$ Kasutaja otsustab sularahaautomaadist raha vĂ€lja vĂ”tta. Tehakse kaks tehingut. Esimene loeb saldo ja kui vahendeid on piisavalt, vĂ€ljastab raha kasutajale. Teine lahutab saldost vajaliku summa. Oletame, et tekib sĂŒsteemi rike ja esimene toiming ebaĂ”nnestub, kuid teine ​​Ônnestub. Sellisel juhul ei saa me raha kasutajale uuesti vĂ€ljastada ilma sĂŒsteemi algseisundisse positiivse saldoga taastamata.

Isolatsioonitasemed

Lugege PĂŒhendunud

Dirty Read probleem seisneb selles, et tehing suudab lugeda teise tehingu vahetulemust.

NÀide. Algsaldo vÀÀrtus on 0 dollarit. T1 lisab teie saldole 50 dollarit. T2 loeb saldovÀÀrtust (50 dollarit). T1 loobub muudatustest ja vÀljub. T2 jÀtkab tÀitmist valede saldoandmetega.

Lahenduseks on fikseeritud andmete lugemine (Read Committed), mis keelab tehinguga muudetud andmete lugemise. Kui tehing A on teatud andmekogumit muutnud, on tehing B nendele andmetele juurde pÀÀsedes sunnitud ootama tehingu A lÔpuleviimist.

Korratav lugemine

Kaotatud vÀrskenduste probleem. T1 salvestab muudatused peale T2 muudatuste.

NĂ€ide. Saldo algvÀÀrtus on 0 dollarit ja saldot tĂ€iendavad kaks tehingut ĂŒheaegselt. T1 ja T2 saldo on 0 dollarit. SeejĂ€rel lisab T2 $200-le 0 dollarit ja salvestab tulemuse. T1 lisab $100-le 0 dollarit ja salvestab tulemuse. LĂ”pptulemus on 100 dollari asemel 300 dollarit.

Kordamatu lugemisprobleem. Samade andmete korduv lugemine tagastab erinevad vÀÀrtused.

NÀide. T1 loeb saldovÀÀrtust $0. SeejÀrel lisab T2 saldole 50 dollarit ja lÔpeb. T1 loeb andmed uuesti ja leiab lahknevuse eelmise tulemusega.

Korduv lugemine tagab, et teine ​​lugemine annab sama tulemuse. Ühe tehinguga loetud andmeid ei saa enne tehingu lĂ”petamist teistes muuta. Kui tehing A on lugenud teatud andmekomplekti, on tehing B nendele andmetele ligi pÀÀsedes sunnitud ootama tehingu A lĂ”petamist.

Tellitud lugemine (serialiseeritav)

Fantoomlugemise probleem. Kaks pÀringut, mis valivad andmeid teatud tingimuse alusel, tagastavad erinevad vÀÀrtused.

NĂ€ide. T1 kĂŒsib kĂ”igi kasutajate arvu, kelle saldo on suurem kui 0 dollarit, kuid vĂ€iksem kui 100 dollarit. T2 vĂ”tab kasutajalt maha 1 dollari, kelle saldo on 101 dollarit. T1 vĂ€ljastab pĂ€ringu uuesti.

Tellitud lugemine (Serialiseeritav). Tehingud sooritatakse tĂ€iesti jĂ€rjestikku. PĂ€ringu tingimustele vastavate kirjete uuendamine vĂ”i lisamine on keelatud. Kui tehing A on kĂŒsinud andmeid kogu tabelist, kĂŒlmutatakse kogu tabel teiste tehingute jaoks kuni tehingu A lĂ”puleviimiseni.

Planeerija

MÀÀrab paralleelsete tehingute ajal toimingute tegemise jÀrjekorra.

Tagab kindlaksmÀÀratud isolatsioonitaseme. Kui tehte tulemus ei sĂ”ltu nende jĂ€rjestusest, siis on sellised tehted kommutatiivsed (Permutable). Lugemistehted ja toimingud erinevate andmetega on kommutatiivsed. Lugemis-kirjutamise ja kirjutamise-kirjutamise operatsioonid ei ole kommutatiivsed. Planeerija ĂŒlesandeks on paralleelsete tehingutega tehtavad toimingud vahele jĂ€tta nii, et tĂ€itmise tulemus oleks samavÀÀrne tehingute jĂ€rjestikuse tĂ€itmisega.

Paralleelsete tööde juhtimise mehhanismid (Concurrency Control)

Optimistlik pÔhineb konfliktide avastamisel ja lahendamisel, pessimistlik aga konfliktide tekkimise vÀltimisel.

Optimistliku lĂ€henemise korral on mitme kasutaja kĂ€sutuses andmete koopiad. Esimene, kes redigeerimise lĂ”petab, salvestab muudatused, teised peavad muudatused liitma. Optimistlik algoritm vĂ”imaldab konfliktidel tekkida, kuid sĂŒsteem peab konfliktist taastuma.

Pessimistliku lÀhenemisviisi korral takistab kasutaja, kes esimesena andmeid hÔivab, teistel andmeid vastu vÔtmast. Kui konflikte esineb harva, on mÔistlik valida optimistlik strateegia, kuna see tagab suurema samaaegsuse.

Lukustus

Kui ĂŒhel tehingul on lukustatud andmed, peavad teised tehingud andmetele ligi pÀÀsedes ootama, kuni see lukust avatakse.

Ploki saab katta andmebaasi, tabeli, rea vĂ”i atribuudiga. Shared Lock saab samadele andmetele peale panna mitme tehinguga, lubab lugeda kĂ”iki tehinguid (ka seda, mis selle kehtestas), keelab muutmise ja eksklusiivse jÀÀdvustamise. Eksklusiivset lukustamist saab rakendada ainult ĂŒhe tehinguga, see lubab kehtestava tehingu mis tahes toiminguid, keelab teiste toimingud.

Ummik on olukord, kus tehingud satuvad ootelolekusse, mis kestab lÔputult.

NĂ€ide. Esimene tehing ootab teise poolt jÀÀdvustatud andmete avaldamist, teine ​​aga esimese poolt hĂ”ivatud andmete avaldamist.

Ummikseisu probleemi optimistlik lahendus vĂ”imaldab ummikseisu tekkida, kuid taastab seejĂ€rel sĂŒsteemi, keerates tagasi ĂŒhe ummikseisuga seotud tehingutest.

Tupikuid otsitakse teatud ajavahemike jĂ€rel. Üks tuvastamismeetodeid on aja jĂ€rgi, see tĂ€hendab, et tehingu lĂ”puleviimiseks kulub liiga kaua aega ummikseisu. Kui ummikseisu leitakse, tĂŒhistatakse ĂŒks tehingutest, mis vĂ”imaldab teistel ummikseisuga seotud tehingutel lĂ”pule viia. Ohvri valikul vĂ”ib lĂ€htuda tehingute vÀÀrtusest vĂ”i nende staaĆŸist (skeemid Wait-Die ja Wound-wait).

Iga tehing T on mÀÀratud ajatempel TS mis sisaldab tehingu algusaega.

Oota-sure.

kui TS (Ti) < TS(Tj)siis Ti ootab, muidu Ti veereb tagasi ja alustab uuesti sama ajatempliga.

Kui noor tehing on omandanud ressursi ja vanem tehing taotleb sama ressurssi, siis lastakse vanemal tehingul oodata. Kui vanem tehing on omandanud ressursi, tĂŒhistatakse seda ressurssi taotlenud noorem tehing.

Haav-oot.

kui TS (Ti) < TS(Tj)siis Tj veereb tagasi ja alustab uuesti sama ajatempliga, muidu Ti ootamas.

Kui noorem tehing on omandanud ressursi ja vanem tehing taotleb sama ressurssi, tĂŒhistatakse noorem tehing. Kui vanem tehing on omandanud ressursi, lastakse seda ressurssi taotleval nooremal tehingul oodata. PresidendipĂ”hine ohvrivalik hoiab Ă€ra ummikseisu, kuid tĂŒhistab tehingud, mis ei ole ummikseisus. Probleem on selles, et tehinguid saab mitu korda tagasi lĂŒkata, kuna... vanem tehing vĂ”ib ressurssi pikka aega hoida.

Ummikuprobleemi pessimistlik lahendus ei vÔimalda tehingu tÀitmist alustada, kui on ummikseisu oht.

Ummikseisu tuvastamiseks konstrueeritakse graaf (ootusgraaf, oota-graaf), mille tipud on tehingud ja servad suunatakse andmete vĂ€ljastamist ootavatest tehingutest tehingule, mis on need andmed pĂŒĂŒdnud. Ummik loetakse aset leidnuks, kui graafikul on silmus. Ootegraafiku koostamine, eriti hajutatud andmebaasides, on kulukas protseduur.

Kahefaasiline lukustus – hoiab Ă€ra ummikseisud, haarates kĂ”ik tehingus kasutatud ressursid tehingu alguses ja vabastades need lĂ”pus

KĂ”ik blokeerimistoimingud peavad eelnema esimesele avamistoimingule. Sellel on kaks faasi – kasvav faas, mille jooksul kĂ€epidemed kogunevad, ja kokkutĂ”mbumisfaas, mille jooksul kĂ€epidemed vabastatakse. Kui mĂ”nda ressurssi pole vĂ”imalik hĂ”ivata, algab tehing otsast. VĂ”imalik, et tehing ei suuda hankida vajalikke ressursse, nĂ€iteks kui mitu tehingut konkureerivad samade ressursside pĂ€rast.

Kahefaasiline kinnitamine tagab, et kinnistamine tÀidetakse kÔigis andmebaasi koopiates

Iga andmebaas logib muudetavad andmed ja vastab koordinaatorile OK-ga (hÀÀletamise etapp). PĂ€rast seda, kui kĂ”ik on OK-ga vastanud, saadab koordinaator signaali, mis nĂ”uab kĂ”igilt muudatuste kinnitamist. PĂ€rast kinnitamist server vasta OK, kui vĂ€hemalt ĂŒks ei vasta OK, saadab koordinaator signaali muudatuste tĂŒhistamiseks kĂ”igile serveritele (lĂ”petamisfaas).

Ajatempli meetod

Vanem tehing tĂŒhistatakse, kui proovitakse pÀÀseda juurde noorema tehinguga seotud andmetele

Igale tehingule mÀÀratakse ajatempel TS mis vastab tĂ€itmise algusajale. Kui Ti ĂŒle Tjsiis TS (Ti) < TS(Tj).

Kui tehing tĂŒhistatakse, mÀÀratakse sellele uus ajatempel. Iga andmeobjekt Q tehingus osalev on tĂ€histatud kahe sildiga. W-TS(Q) — kĂ”ige noorema tehingu ajatempel, mis edukalt lĂ”petas kirje Q. R-TS(Q) — kĂ”ige noorema tehingu ajatempel, mis salvestas lugemise Q.

Kui tehing T andmete lugemise taotlused Q On kaks vÔimalust.

kui TS(T) < W-TS(Q), see tÀhendab, et andmeid uuendas noorem tehing, siis tehing T veereb tagasi.

kui TS(T) >= W-TS(Q), siis sooritatakse lugemine ja R-TS(Q) on muutumas MAX(R-TS(Q), TS(T)).

Kui tehing T nÔuab andmete muutmist Q On kaks vÔimalust.

kui TS(T) < R-TS(Q), ehk siis andmed on juba noorema tehingu poolt lÀbi loetud ja muudatuse tegemisel tekib konflikt. Tehing T veereb tagasi.

kui TS(T) < W-TS(Q), see tĂ€hendab, et tehing ĂŒritab uuemat vÀÀrtust ĂŒle kirjutada, tehing T keritakse tagasi. Muudel juhtudel viiakse muudatus lĂ€bi ja W-TS(Q) muutub vĂ”rdseks TS(T).

Ei ole vaja kallist ootegraafiku koostamist. Vanemad tehingud sĂ”ltuvad uuematest, seega pole ootegraafikus tsĂŒkleid. Ummikuid ei teki, sest tehinguid ei oodata, vaid veeretatakse kohe tagasi. VĂ”imalik on kaskaadne tagasipööramine. Kui Ti veeres minema ja Tj Lugesin andmeid, mida muutsin Tisiis Tj peaks ka tagasi kerima. Kui samal ajal Tj on juba toime pandud, siis rikutakse stabiilsuse pĂ”himĂ”tet.

Üks kaskaadsete tagasipööramiste lahendusi. Tehing lĂ”petab kĂ”ik kirjutamistoimingud lĂ”pus ja teised tehingud peavad ootama selle toimingu lĂ”petamist. Tehingud ootavad enne lugemist sooritamist.

Thomase kirjutamisreegel – ajatempli meetodi variatsioon, mille puhul on keelatud vanema tehinguga vĂ€rskendatud andmeid ĂŒle kirjutada

Tehing T nĂ”uab andmete muutmist Q. Kui TS(T) < W-TS(Q), see tĂ€hendab, et tehing ĂŒritab uuemat vÀÀrtust ĂŒle kirjutada, tehingut T ei keerata tagasi nagu ajatempli meetodil.

Allikas: www.habr.com

Ostke DDoS-kaitsega saitide jaoks usaldusvÀÀrne hostimine, VPS VDS-serverid đŸ”„ Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega, VPS VDS serverid | ProHoster