Tehingud ja nende kontrollimehhanismid

Tehingud

Tehing on andmete töötlemise jÀrjestikune operatsioonide jada, millel on algus ja lÔpp.

Tehing on jĂ€rjestikune lugemise ja kirjutamise operatsioonide tĂ€itmine. Tehingu lĂ”petamine vĂ”ib olla kas muudatuste salvestamine (committing) vĂ”i muudatuste tĂŒhistamine (rollback). Andmebaasi kontekstis on tehing mĂ”ned pĂ€ringud, mida kĂ€sitletakse kui ĂŒhte pĂ€ringut.

Tehingud peavad vastama ACID omadustele.

Aatomaarus. Tehing tĂ€idetakse kas tĂ€ielikult vĂ”i mitte ĂŒldse.

Kohandatavus. Tehingu lĂ”ppedes ei tohi andmetele kehtestatud piirangud (nt andmebaasi constraints) olla rikutud. Kohandatavus tĂ€hendab, et sĂŒsteem viiakse ĂŒhest korrektset olekust teise korrektsetesse.

Isolatsioon. Samal ajal toimivad tehingud ei tohi mĂ”jutada ĂŒksteist, nĂ€iteks muuta andmeid, mida kasutab teine tehing. Samal ajal toimetavate tehingute tulemus peab olema selline, nagu oleks tehingud toiminud jĂ€rjestikku.

Kestvus. PĂ€rast kinnitamist ei tohi muudatused kaduda.

Tehingu ajalugu.

Ajaloos sĂ€ilitatakse tehingute kĂ€igus tehtud muudatused, mis tagavad andmete aatomaaruse ja kestvuse sĂŒsteemi rikke korral.

Ajalugu sisaldab vÀÀrtusi, mida andmed olid enne ja pĂ€rast muudatust, mille tehing tegi. Write-ahead log strateegia nĂ”uab, et ajaloosse lisataks kirje varasemate vÀÀrtuste kohta enne algust ja lĂ”ppvÀÀrtuste kohta pĂ€rast tehingu lĂ”petamist. SĂŒsteemi ootamatul seiskamisel loeb andmebaas ajalugu tagurpidi ja tĂŒhistab tehingute tehtud muudatused. Kohtumine poolelioleva tehinguga, teostab andmebaas selle ja salvestab muudatused ajaloosse. Seisundis, mis oli seiskamise hetkel, loeb andmebaas ajalugu otse ja taastab tehingute tehtud muudatused. Nii sĂ€ilitatakse juba kinnitatud tehingute kestvus ja poolelioleva tehingu aatomaarus.

Lihtne vigaste tehingute korduv tÀitmine ei ole piisav taastumise tagamiseks.

NĂ€ide. Kasutaja kontol on 500$ ja ta otsustab need automaadist vĂ€lja vĂ”tta. Teostatakse kaks tehingut. Esimene loeb saldo vÀÀrtust ja kui kontol on piisavalt raha, antakse raha kasutajale vĂ€lja. Teine lahutab vajalikku summat saldopausist. Oletame, et sĂŒsteem tĂ”rkus ja esimene operatsioon ei Ă”nnestunud, kuid teine Ă”nnestus. Sel juhul ei saa me pĂ€rast sĂŒsteemi normaalsesse olekusse viimist kasutajale raha uuesti vĂ€lja anda, kui saldo pole positiivne.

Isolatsiooni tasemed

Fikseeritud andmete lugemine (Read Committed)

Kuidaseisev lugemise probleem (Dirty Read) seisneb selles, et tehing vÔib lugeda teise tehingu vahepealseid tulemusi.

NĂ€ide. Algne saldo on 0$. T1 lisab saldole 50$. T2 loeb saldo vÀÀrtuse (50$). T1 tĂŒhistab muudatused ja lĂ”petab. T2 jĂ€tkab vale saldoandmetega, mis on loetud.

Lahendus on fikseeritud andmete lugemine (Read Committed), mis keelab lugeda tehingu poolt muudetud andmeid. Kui tehing A muuda mingit andmevahet, siis tehing B peab ootama tehingu A lÔpetamist, et nende andmete juurde pÀÀseda.

Korratav lugemine (Repeatable Read)

VĂ€lja kadunud muudatuste probleem (Lost Updates). T1 salvestab muudatuse T2 ĂŒle.

NĂ€ide. Algne saldo on 0$ ja kaks tehingut ĂŒheaegselt lisavad saldo. T1 ja T2 loevad saldo, mis on 0$. Siis T2 lisab 200$ 0$-le ja salvestab tulemuse. T1 lisab 100$ 0$-le ja salvestab tulemuse. LĂ”pp Tulemus on 100$ asemel 300$.

Korduvate lugemiste probleem (Unrepeatable read). Andmete korduv lugemine toob tagasi erinevad vÀÀrtused.

NĂ€ide. T1 loeb saldo vÀÀrtuse, mis on 0$. Siis T2 lisab saldole 50$ ja lĂ”petab. T1 loeb andmed uuesti ja leiab, et see ei ĂŒhti eelmise tulemusega.

Korratav lugemine (Repeatable Read) tagab, et korduv lugemine annab sama tulemuse. Andmeid, mis on loetud ĂŒhe tehingu poolt, ei tohi teised muuta enne tehingu lĂ”petamist. Kui tehing A loeb mingit andmevahet, peab tehing B ootama tehingu A lĂ”petamist, et nende andmete juurde pÀÀseda.

JĂ€rjekordne lugemine (Serializable)

Fantomi lugemise probleem (Phantom Reads). Kaks pÀringut, mis valivad andmeid mingi tingimuse jÀrgi, tagastavad erinevad vÀÀrtused.

NĂ€ide. T1 kĂŒsib, kui palju on kĂ”iki kasutajaid, kelle saldo on suurem kui 0$ aga vĂ€iksem kui 100$. T2 vĂ€hendab kasutaja saldot, kelle saldo on 101$, 1$ vĂ”rra. T1 tĂ€idab pĂ€ringu uuesti.

Korrastatud lugemine (Serializable). Tehingud viiakse lĂ€bi nagu tĂ€iesti jĂ€rjestikused. Uuendamine ja uute kirje lisamine, mis kuuluvad pĂ€ringu tingimuste alla, on keelatud. Kui tehing A kĂŒsib kogu tabeli andmeid, siis tabel kĂŒlmutatakse tĂ€ielikult teiste tehingute jaoks kuni tehing A lĂ”petamiseni.

Kavandaja (Scheduler)

Seab jÀrjestuse, milles tehingud peavad toimuma paralleelselt toimuvaid tehingute puhul.

Tagab etteantud isolatsioonitaseme. Kui tehingute teostamise tulemus ei sĂ”ltu nende jĂ€rjestusest, on need tegevused kommutatiivsed (Permutable). Kommutatiivsed on lugemisoperatsioonid ja tegevused erinevate andmete ĂŒle. Lugemise-kirjutamise ja kirjutamise-kirjutamise operatsioonid ei ole kommutatiivsed. Kavandaja ĂŒlesanne on vaheldada paralleelsete tehingute teostatud operatsioone nii, et teostamise tulemus oleks vĂ”rreldav jĂ€rjestikuse teostamisega.

Paralleelselt toimivate ĂŒlesannete juhtimise mehhanismid (Concurrency Control)

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

Optimistliku lĂ€henemise korral saavad mitmed kasutajad andmete koopiad. Esimene, kes lĂ”petab redigeerimise, salvestab muudatused, teised peavad sulandama muudatused. Optimistlik algoritm vĂ”imaldab konfliktide tekkimist, kuid sĂŒsteem peab pĂ€rast konflikti taastuma.

Pessimistliku lÀhenemise korral takistab esimesena andmeid saanud kasutaja teistele andmete saamise. Kui konfliktid on harvad, on mÔistlik valida optimistlik strateegia, kuna see tagab kÔrgema paralleelsuse taseme.

Lukustamine (Locking)

Kui ĂŒks tehing on andmeid lukustanud, peavad kĂ”ik teised tehingud andmetele juurdepÀÀsu saamisel ootama lukustuse vabastamist.

Blokk vĂ”ib kanda andmebaasil, tabelil, real vĂ”i atribuudi peal. Jagatud lukustus (Shared Lock) vĂ”ib kehtida samaaegselt mitmest tehingust samadele andmetele, vĂ”imaldades kĂ”igil tehingutel (sealhulgas lukustuse seadnud) lugeda, kuid keelates muutmise ja monopolise kogu. Monopol lukustus (Exclusive Lock) vĂ”ib kehtida ainult ĂŒhele tehingule, lubades sellel tehingul teha kĂ”iki toiminguid, kuid keelates asjaomastele teistele.

SĂŒnnikovaks nimetatakse olukorda, kus tehingud jÀÀvad lĂ”putuks ootereĆŸiimiks.

NĂ€ide. Esimene tehing ootab, kuni teine vabastab kinni peetud andmed, samas kui teine ootab, kuni esimene vabastab oma kinni peetud andmed.

Optimistlik lahendus ummikseisu probleemile vĂ”imaldab ummikseisu tekkimist, kuid seejĂ€rel taastab sĂŒsteemi, tagastades ĂŒhe ummikseisus osaleva tehingu.

Teatud ajavahemike jĂ€rel otsitakse ummikseisu. Üks tuvastamise meetod on aja pĂ”hjal — see tĂ€hendab, et arvatakse, et ummikseis on juhtunud, kui tehing kestab liiga kaua. Kui ummikseis on leitud, siis tagastatakse ĂŒks tehingud, mis vĂ”imaldab teistel ummikseisus osalejatel lĂ”petada. Ohvri valik vĂ”ib pĂ”hineda tehingute maksumusel vĂ”i nende vanusel (Wait-Die ja Wound-wait skeemid).

Iga tehing T saa ajamÀrgi TS mis sisaldab tehingu kÀivitamise aega.

Wait-Die.

Kui TS(Ti) < TS(Tj), siis Ti ootab, muidu Ti tagastatakse ja algab uuesti sama ajamÀrgiga.

Kui noorem tehing on kinni hoidnud ressursi ja vanem taotleb sama ressurssi, siis on vanemale tehingule lubatud oodata. Kui vanem tehing on kinni hoidnud ressursi, siis tagastatakse noorem tehing, mis taotleb seda ressurssi.

Wound-wait.

Kui TS(Ti) < TS(Tj), siis Tj tagastatakse ja algab uuesti sama ajamÀrgiga, muidu Ti ootab.

Kui noorem tehing on ressurssi haaranud ja vanem tehing nÔuab sama ressurssi, siis noorem tehing katkestatakse. Kui vanem tehing on ressurssi haaranud, on nooremale tehingule, mis seda ressurssi nÔuab, lubatud oodata. Ohvri valik, mis pÔhineb vanusel, takistab ummikseisude tekkimist, kuid katkestab tehingud, mis ei ole ummikseisus. Probleem seisneb selles, et tehingud vÔivad korduvalt katkestada, kuna vanem tehing vÔib ressursse pikalt hoida.

Pessimistik lÀhenemine ummikseisude probleemile ei luba tehingu tÀitmist, kui on oht ummikseisu tekkimiseks.

Ummikseisu tuvastamiseks ehitatakse graaf (oote-graaf, wait-for-graph), mille tipud on tehingud ning servad on suunatud tehingutelt, mis ootavad andmete vabastamist, tehingutele, mis on need andmed haaranud. Uurimise korral peetakse ummikseisu toimunuks, kui graaf on tsĂŒkliline. Oote-graafi koostamine, eriti jaotatud andmebaasides, on kulukas protseduur.

KahefÀÀriline lukustamine — ummikseisude vĂ€ltimine, haarates kĂ”ik tehingu jaoks vajalikud ressursid tehingu alguses ja vabastades need lĂ”puks.

KĂ”ik lukustavad toimingud peavad eelnema esimesele vabastavale toimingule. Sellel on kaks faasi — kasvufaas, mille kĂ€igus toimub haaramine, ja kahanev faas, mille kĂ€igus toimub vabastamine. Kui ressursi haaramine ei Ă”nnestu, algab tehing uuesti. On vĂ”imalik olukord, kus tehing ei suuda vajalikke ressursse haarata, nĂ€iteks kui mitu tehingut konkureerivad samade ressursside ĂŒle.

KahefÀÀriline kinnitamine tagab kinnitamise kÔigis andmebaasi koopiates.

Iga andmebaas kannab oma logisse andmed, mida muudetakse, ja vastab koordinaatorile OK (HÀÀletusfaas). PĂ€rast seda, kui kĂ”ik on vastanud OK, saadab koordinaator signaali, mis kohustab kĂ”iki kinnitama. PĂ€rast kinnitamist serverilt vastatakse OK, kui vĂ€hemalt ĂŒks ei vastanud OK, saadab koordinaator signaali muudatuste tĂŒhistamiseks kĂ”igile serveritele (LĂ”petamise faas).

Ajatempli meetod

Vanem tehing katkestatakse, kui ta pĂŒĂŒab pÀÀseda juurde andmetele, mis on seotud noorema tehinguga.

Iga tehingu puhul mÀÀratakse ajatemperatuur TS vastavalt teostamise algusajale. Kui Ti vanem Tj, siis TS(Ti) < TS(Tj).

Kui tehing tĂŒhistatakse, mÀÀratakse sellele uus ajatemperatuur. Iga andmeobjekt Q mille tehing kaasas, mĂ€rgitaan kahe ajatemperatuuriga. W-TS(Q) — kĂ”ige noorema tehingu ajatemperatuur, mis on edukalt teinud kirje Q. R-TS(Q) — kĂ”ige noorema tehingu ajatemperatuur, mis on teinud lugemiskirje Q.

Kui tehing T taotleb andmete lugemist Q on kaks vÔimalust.

Kui TS(T) < W-TS(Q), see tĂ€hendab, et andmeid on vĂ€rskendanud noorem tehing, siis tehing T tĂŒhistatakse.

Kui TS(T) >= W-TS(Q), siis lugemine toimub ja R-TS(Q) muuta MAX(R-TS(Q), TS(T)).

Kui tehing T taotleb andmete muutmist Q on kaks vÔimalust.

Kui TS(T) < R-TS(Q), see tĂ€hendab, et andmeid on juba lugenud noorem tehing ja kui muudatus teostatakse, siis tekib konflikt. Tehing T tĂŒhistatakse.

Kui TS(T) < W-TS(Q), see tĂ€hendab, et tehing proovib kirjutada uuemat vÀÀrtust, tehing T tĂŒhistatakse. Muudel juhtudel toimub muudatus ja W-TS(Q) muutub vĂ”rdses TS(T).

Kulukas oote graafiku koostamine pole vajalik. Vanemad tehingud sĂ”ltuvad noorematest, seega ei esine ootegraafikus tsĂŒkleid. Ei ole ummistusi, kuna tehingud ei oota, vaid tĂŒhistatakse kohe. KaskaditĂŒhistamised on vĂ”imalikud. Kui Ti tĂŒhistati ja Tj luges andmeid, mille ta muutis Ti, siis Tj peab samuti tĂŒhistama. Kui sel hetkel Tj oli juba kinnitatud, siis tekib vastuolu jĂ€rjepidevuse printsiibiga.

Üks lahendus kaskaditĂŒhistamistele. Tehing viib kĂ”ik kirjutamistegevused lĂ”pule, samal ajal kui teised tehingud peavad ootama selle tegevuse tĂ€itmist. Tehingud ootavad kinnitamist enne lugemist.

Thomas'i kirjutamise reegel — variatsioon ajatemperatuuri meetodist, mille kohaselt on andmete, mida on vĂ€rskendanud noorem tehing, kirjutamine vanema tehingu poolt keelatud.

Tehing T taotleb andmete muutmist Q. Kui TS(T) < W-TS(Q), see tĂ€hendab, et tehing proovib kirjutada uuemat vÀÀrtust, tehing T ei tĂŒhistata nagu ajatemperatuuri meetodis.

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