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 on 500 dollarit ja kasutaja otsustab selle pangaautomaadist välja võtta. Kaks tehingut on pooleli. Esimene loeb saldo väärtuse ja kui saldol on piisavalt raha, väljastab see kasutajale raha. Teine lahutab saldost vajaliku summa. Oletame, et süsteem jooksis kokku ja esimene toiming ebaõnnestus, kuid teine ​​ebaõnnestus. Sellisel juhul ei saa me kasutajale raha uuesti väljastada ilma süsteemi algsesse olekusse tagastamata positiivse saldoga.

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 sisestab logisse info muudetavate andmete kohta ja vastab koordinaatorile OK (hääletusfaas). Kui kõik on hästi vastanud, saadab koordinaator signaali, mis kohustab kõiki pühenduma. Pärast sidumist vastavad serverid OK; kui vähemalt üks ei vasta OK, saadab koordinaator signaali muudatuste tühistamiseks kõikidele 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

Lisa kommentaar