Tehingud ja nende kontrollimise mehhanismid

Tehingud

Tehingu all mÔistetakse andmete töötlemise jÀrjepidevust, millel on algus ja lÔpp.

Tehing on jĂ€rjestikune lugemise ja kirjutamise teostamine. Tehingu lĂ”petamine vĂ”ib toimuda kas muudatuste salvestamise (commit) vĂ”i tagasivĂ”tmise (rollback) kaudu. Andmebaaside kontekstis on tehing mitmest pĂ€ringust, mis tĂ”lgendatakse kui ĂŒhtset pĂ€ringut.

Tehingud peavad vastama ACID omadustele.

Aatomaarne. Tehing kas tĂ€idetakse tĂ€ielikult vĂ”i ei tĂ€ideta ĂŒldse.

Konsistentsus. Tehingu lĂ”pus ei tohi andmetele kehtestatud piirangud (nĂ€iteks andmebaasi piirangud) olla rikutud. Konsistentsus tĂ€hendab, et sĂŒsteem liikuda ĂŒhe korrektse oleku juurest teise korrektse olekuni.

Isolatsioon. Paralleelselt toimuvaid tehinguid ei tohi mÔjutada, nÀiteks ei tohi nad muuta andmeid, mida kasutab teine tehing. Paralleelselt toimivate tehingute tulemus peab olema sama, mis siis, kui tehingud toimuksid jÀrjestikku.

Kestvus. PĂ€rast kinnitamist ei tohi muudatused kaduma minna.

Tehingute ajakiri.

Ajakiri salvestab tehingute teostatud muudatused, tagades andmete aatomaarse ja kestva oleku sĂŒsteemi talitlushĂ€ire korral.

Ajakiri sisaldab andmeid, mis olid enne ja pĂ€rast nende muutmist tehingu kĂ€igus. Write-ahead log strateegia nĂ”uab, et logisse lisataks eelnevad vÀÀrtused enne tehingu algust ja lĂ”pu vÀÀrtused pĂ€rast selle lĂ”petamist. SĂŒsteemi Ă€kilise peatamise korral loeb andmebaas logi vastupidises jĂ€rjekorras ja tĂŒhistab tehingute tekitatud muudatused. Kui ajutiselt katkestatud tehing esitatakse, teostab andmebaas selle ja kannab tehingute muutused logisse. Oleku taastamisel jĂ”hkruse hetkel loeb andmebaas logi sirgjooneliselt ning tagastab tehingute tekitatud muudatused. Nii sĂ€ilib juba kinnitatud tehingute kestvus ja katkestatud tehingu aatomaarne olek.

Lihtne vigaste tehingute korduv teostamine ei ole piisav taastamiseks.

NĂ€ide. Kasutaja kontol on 500$ ja kasutaja otsustab need automaadist vĂ€lja vĂ”tta. Teostatakse kaks tehingut. Esimene loeb saldo vÀÀrtust ja kui saldos on piisavalt vahendeid, annab see raha kasutajale. Teine vĂ€hendab vajaliku summa saldost. Oletame, et sĂŒsteemis tekkis tĂ”rge ja esimene operatsioon ei toimunud, kuid teine toimus. Sel juhul ei saa me raha kasutajale uuesti vĂ€lja anda, ilma et taastaksime sĂŒsteemi algsesse seisundisse positiivse saldo saavutamiseks.

Isolatsiooni tasemed.

Lugemine fikseeritud andmetest (Read Committed).

Kleebise probleemi (Dirty Read) puhul vÔib tehing lugeda teise tehingu vahepealset tulemust.

NĂ€ide. Algne saldo on 0$. T1 lisab saldot 50$. T2 loeb saldo vÀÀrtusena (50$). T1 tĂŒhistab muudatused ja lĂ”petab. T2 jĂ€tkab tegevust, tuginedes valele saldo andmele.

Lahenduseks on lugemine fikseeritud andmetest (Read Committed), mis keelab tehingul lugeda andmeid, mida on muutnud teine tehing. Kui tehing A muutis mingit andmehulg, peab tehing B selle andmehulkade taotlemisel ootama, kuni tehing A on lÔpetatud.

Korduv lugemine (Repeatable Read).

Kadunud muutuste probleem (Lost Updates). T1 salvestab muudatused T2 tehtud muudatuste peale.

NÀide. Algne saldo on 0$ ja kaks tehingut tÀiendavad saldot samal ajal. T1 ja T2 loevad saldot, mis on 0$. Siis T2 lisab 200$ 0$-le ja salvestab tulemuse. T1 lisab 100$ 0$-le ja salvestab tulemuse. LÔpptulemus on 100$ asemel 300$.

Korduv lugemise probleem (Unrepeatable Read). Korduv lugemine sama andmete kohta annab erinevaid vÀÀrtusi.

NĂ€ide. T1 loeb saldo vÀÀrtust, mis on 0$. Siis T2 lisab saldot 50$ ja lĂ”petab. T1 loeb andmed uuesti ja avastab, et need ei ĂŒhti varasema tulemusega.

Korduv lugemine (Repeatable Read) tagab, et korduv lugemine toob kaasa sama tulemuse. Ühte andmehulka, mida on lugenud ĂŒhe tehingu kĂ€igus, ei tohi teise tehingu kĂ€igus muuta enne selle lĂ”petamist. Kui tehing A luges mingit andmehulg, peab tehing B nende andmete taotlemisel ootama tehingu A lĂ”petamist.

Korrastatud lugemine (Serializable).

Fantoomlugemise probleem (Phantom Reads). Kaks pÀringut, mis valivad andmeid mingite tingimuste alusel, toovad erinevaid vÀÀrtusi.

NĂ€ide. T1 kĂŒsib kĂ”igi kasutajate arvu, kelle saldo on ĂŒle 0$ ja alla 100$. T2 vĂ€hendab ĂŒhe dollari kasutajalt, kelle saldo on 101$. T1 tĂ€idab pĂ€ringu uuesti.

JĂ€rjestatud lugemine (Serializable). Tehingud teostatakse tĂ€ielikult jĂ€rjestikustena. Uuendamine ja uute kirje lisamine, mis kuuluvad pĂ€ringu tingimuste alla, on keelatud. Kui tehing A kĂŒsib andmeid kogu tabelist, siis tabel kĂŒlmutatakse tĂ€ielikult teiste tehingute jaoks, kuni tehing A on lĂ”petatud.

Ajastaja (Scheduler)

MÀÀrab jÀrjekorra, milles operatsioonid peavad toimuma paralleelsete tehingute korral

Tagab mÀÀratud isolatsioonitaseme. Kui operatsioonide tĂ€itmine ei sĂ”ltu nende jĂ€rjekorrast, on need operatsioonid kommutatiivsed (Permutable). Kommutatiivsed on lugemisoperatsioonid ja operatsioonid erinevate andmete ĂŒle. Kirjutamis- ja kirjutamisoperatsioonid ei ole kommutatiivsed. Ajastaja ĂŒlesanne on vaheldada paralleelselt toimivate tehingute tĂ€idetavaid operatsioone, et tulemus oleks ekvivalentne jĂ€rjestikuse tehingute tĂ€itmisega.

Paralleelsete ĂŒlesannete kontrollimehhanismid (Concurrency Control)

Optimeeritud pÔhineb konfliktide tuvastamisel ja lahendamisel, pessimistlik konfliktide vÀltimisel

Optimeeritud lĂ€henemisel saavad mitmed kasutajad andmete koopiad. Esimene, kes lĂ”petab redigeerimise, salvestab muudatused, ĂŒlejÀÀnud peavad muudatused sulandama. Optimeeritud algoritm laseb konfliktidel tekkida, kuid sĂŒsteem peab pĂ€rast konflikti taastuma.

Pessimistlikul lÀhenemisel takistab esimene kasutaja, kes andmed haarab, teistele andmete saamist. Kui konfliktid on haruldased, on mÔistlik valida optimeeritud strateegia, kuna see tagab kÔrgema paralleelsuse taseme.

Lukustus (Locking)

Kui ĂŒks tehing on andmed lukustanud, peavad teised tehingud andmetele juurde pÀÀsemisel ootama lukustuse vabastamist.

Lukku vĂ”ib rakendada andmebaasile, tabelile, reale vĂ”i atribuudi. Jagatud lukk (Shared Lock) vĂ”ib olla rakendatud samadele andmetele mitme tehingu poolt, vĂ”imaldades kĂ”igile tehingutele (ka lukustavale) lugemist, keelates muutmise ja monopoolsed haaramised. Monopoolsed haaramised (Exclusive Lock) vĂ”ivad olla rakendatud ainult ĂŒhe tehingu poolt, vĂ”imaldades lukustavale tehingule kĂ”iki tegevusi, kuid keelates kĂ”igi teiste tegevused.

Muutumislukustus on olukord, kus tehingud jÀÀvad ootereĆŸiimile, mis kestab lĂ”pmata kaua.

NĂ€ide. Esimene tehing ootab teise tehingu haaratud andmete vabastamist, samas kui teine ootab esimese poolt haaratud andmete vabastamist.

Optimeeritud lahendus muutumislukustuste probleemile lubab muutumislukustuste tekkimist, kuid seejĂ€rel taastab sĂŒsteemi, tagasi pöörates ĂŒhe muutuvas lukustuses osaleva tehingu.

Kindla ajavahemiku tagant otsitakse muutumislukustusi. Üks meetod nende tuvastamiseks on ajapĂ”hine, st arvestatakse, et muutumislukustus on aset leidnud, kui tehing kestab liiga kaua. Kui muutumislukustus leitakse, pööratakse ĂŒks tehing tagasi, mis vĂ”imaldab teistel muutumislukustusprotsessis osalevatel tehingutel lĂ”pule viia. Ohvri valik vĂ”ib pĂ”hineda tehingute maksumusel vĂ”i nende vanusel (Wait-Die ja Wound-wait skeemid).

Iga tehingule T antakse ajatemple; TS mis sisaldab tehingu kÀivitamise aega.

Wait-Die.

Kui TS(Ti) < TS(Tj), siis Ti ootab, vastasel juhul Ti pöördub tagasi ja alustab algusest sama ajatemplega.

Kui noorem tehing on haaranud ressursi, ja vanem tehing kĂŒsib sama ressursi, siis vanemale tehingule lubatakse oodata. Kui vanem tehing on ressursi haaranud, siis noorem tehing, kes seda ressurssi kĂŒsib, pööratakse tagasi.

Wound-wait.

Kui TS(Ti) < TS(Tj), siis Tj pöördub tagasi ja alustab algusest sama ajatemplega, vastasel juhul Ti ootab.

Kui noorem tehing on ressursi haaranud, ning vanem tehing kĂŒsib sama ressurssi, siis noorem tehing pööratakse tagasi. Kui vanem tehing on ressursi haaranud, on vanemal tehingul, kes kĂŒsib seda ressurssi, lubatud oodata. Ohvri valik vanuse alusel takistab muutumislukustuste teket, kuid pöörab tagasi tehingud, mis ei ole muutumislukustuses. Probleem seisneb selles, et tehingud vĂ”ivad korduvalt tagasi pöörduda, kuna vanem tehing vĂ”ib ressursi kaua hoida.

Pessimistlik lahendus muutumislukustuste probleemile ei luba tehingu algust, kui esineb muutumislukustuse tekkimise risk.

Deadlock'i tuvastamiseks luuakse graaf (ootegraaf, wait-for-graph), mille tipud on tehingud ning servirakud on suunatud tehingutest, mis ootavad andmete vabastamist, tehingutele, mis on need andmed juba haaranud. Deadlock'i leiab aset, kui graafil on tsĂŒkkel. Oote graafi loomine, eriti jaotatud andmebaasides, on kulukas protsess.

Kaksifaasiline lukustus — deadlock'ide vĂ€ltimine, haarates kĂ”ik tehinguga seotud ressursid tehingu alguses ja vabastades need tehingu lĂ”pus.

KĂ”ik lukustusoperatsioonid peavad eelnevalt olema enne esimest vabastavat operatsiooni. Sellel on kaks faasi — Growing Phase, kus toimub haarangute kogumine, ja Shrinking Phase, kus toimub haarangute vabastamine. Kui ĂŒhe ressursi haaramine on vĂ”imatu, peab tehing algama uuesti. On vĂ”imalik, et tehing ei suuda vajalikke ressursse haarata, nĂ€iteks kui mitu tehingut konkureerivad ĂŒhe ressursi pĂ€rast.

Kaksifaasiline kinnitamine tagab, et kÔik andmebaasi koopiad viivad lÀbi kinnitamise.

Iga andmebaas kannab logisse kirje, et andmed, mida muudetakse, ning vastab koordinaatorile OK (HÀÀletusfaas). Kui kĂ”ik on vastanud OK, saadab koordinaator signaali, mis kohustab kĂ”iki kinnitama. PĂ€rast kinnitamist serverile vastatakse OK, kui mitte ĂŒkski ei vasta OK-le, saadab koordinaator kĂ”igile serveritele signaali muudatuste tĂŒhistamiseks (TĂ€iendamise faas).

Ajatempli meetod

Vanem tehing tĂŒhistatakse, kui ta ĂŒritab juurde pÀÀseda andmetele, mida on juba kasutanud noorem tehing.

Iga tehingule mÀÀratakse ajatemple, TS mis vastab tÀitmise alguse ajale. Kui Ti on vanem, Tj, siis TS(Ti) < TS(Tj).

kui tehing tĂŒhistatakse, mÀÀratakse sellele uus ajatemple. Iga andmeobjekt K mida tehing kasutab, mĂ€rgistatakse kahe templi. W-TS(Q) — noorima tehingu ajatemple, kes on edukalt teinud kirjutamise K. R-TS(Q) — noorima tehingu ajatemple, kes on teinud lugemise kirjutamise K.

Kui tehing T taotleb andmete lugemist, K on kaks vÔimalikku varianti.

Kui TS(T) < W-TS(Q), st andmed on uuendatud noorema tehingu poolt, siis tehing T tĂŒhistatakse.

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

Kui tehing T taotleb andmete muutmist, K on kaks vÔimalikku varianti.

Kui TS(T) < R-TS(Q), st andmed on juba loetud noorema tehingu poolt ja kui muudatust teostatakse, siis tekib konflikt. Tehing T tĂŒhistatakse.

Kui TS(T) < W-TS(Q), st tehing ĂŒritab kirjutada uuemat vÀÀrtust, tehing T tĂŒhistatakse. ÜlejÀÀnud juhtudel toimub muudatus ja W-TS(Q) saab vĂ”rdseks TS(T).

Oote graafi kallis loomine ei ole vajalik. Vanemad tehingud sĂ”ltuvad noorematest, seega ei ole oote graafis tsĂŒkleid. Deadlock'e ei esine, kuna tehingud ei oota, vaid tĂŒhistatakse kohe. Kaskadised tĂŒhistamised on vĂ”imalikud. Kui Ti tĂŒhistatakse ja Tj luges andmeid, mida ta muutis, Ti, siis Tj peab samuti tĂŒhistama. Kui sel juhul Tj oli juba kinnitatud, tekib stabiilsuse pĂ”himĂ”tte rikkumine.

Üks lahendus kaskadiste tĂŒhistamiste puhul. Tehing viib kĂ”ik kirjutamise operatsioonid ellu lĂ”pus, kusjuures teised tehingud peavad ootama selle operatsiooni lĂ”petamist. Tehingud ootavad kinnitamist enne lugemist.

Thomas'i kirjutamise reegel — ajatempli meetodi variatsioon, millega on keelatud noorema tehingu poolt uuendatud andmeid vanema tehingu poolt uuesti kirjutada.

Tehing T taotleb andmete muutmist, K. Kui TS(T) < W-TS(Q), st tehing ĂŒritab kirjutada uuemat vÀÀrtust, tehing T ei tĂŒhistata nagu ajatempli meetodis.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster