Transaksionet dhe mekanizmat e kontrollit të tyre

transaksionet

Një transaksion është një sekuencë operacionesh mbi të dhënat që ka një fillim dhe një fund.

Një transaksion është ekzekutimi i njëpasnjëshëm i operacioneve të leximit dhe shkrimit. Përfundimi i një transaksioni mund të jetë ose ruajtja e ndryshimeve (kommit) ose anulimi i ndryshimeve (kthimi prapa). Në lidhje me një bazë të dhënash, një transaksion përbëhet nga disa kërkesa që trajtohen si një kërkesë e vetme.

Transaksionet duhet të plotësojnë vetitë ACID

Atomiciteti. Transaksioni ose është përfunduar plotësisht ose aspak.

Konsistenca. Kur kryeni një transaksion, kufizimet e vendosura mbi të dhënat (për shembull, kufizimet në bazën e të dhënave) nuk duhet të shkelen. Konsistenca nënkupton që sistemi do të transferohet nga një gjendje e saktë në një gjendje tjetër të saktë.

Izolim. Transaksionet që zhvillohen paralelisht nuk duhet të ndikojnë njëra-tjetrën, për shembull, të ndryshojnë të dhënat e përdorura nga një transaksion tjetër. Rezultati i ekzekutimit të transaksioneve paralele duhet të jetë i njëjtë sikur transaksionet të ishin ekzekutuar në mënyrë sekuenciale.

Qëndrueshmëria. Pasi të kryhen, ndryshimet nuk duhet të humbasin.

Regjistri i transaksioneve

Regjistri ruan ndryshimet e bëra nga transaksionet, siguron atomicitetin dhe stabilitetin e të dhënave në rast të një dështimi të sistemit

Regjistri përmban vlerat që kanë pasur të dhënat para dhe pasi janë ndryshuar nga transaksioni. Strategjia e regjistrit të shkrimit përpara kërkon shtimin e një hyrjeje të regjistrit për vlerat e mëparshme përpara fillimit dhe për vlerat përfundimtare pas përfundimit të transaksionit. Në rast të një ndalimi të papritur të sistemit, baza e të dhënave lexon regjistrin në rend të kundërt dhe anulon ndryshimet e bëra nga transaksionet. Duke hasur në një transaksion të ndërprerë, baza e të dhënave e ekzekuton atë dhe bën ndryshime në lidhje me të në regjistër. Duke qenë në gjendjen në momentin e dështimit, baza e të dhënave lexon regjistrin në rendin përpara dhe kthen ndryshimet e bëra nga transaksionet. Në këtë mënyrë ruhet qëndrueshmëria e transaksioneve që tashmë janë kryer dhe atomiciteti i transaksionit të ndërprerë.

Thjesht riekzekutimi i transaksioneve të dështuara nuk është i mjaftueshëm për rikuperim.

Shembull. Përdoruesi ka 500 dollarë në llogarinë e tij dhe përdoruesi vendos t'i tërheqë nga një ATM. Dy transaksione janë në proces. E para lexon vlerën e bilancit dhe nëse ka fonde të mjaftueshme në bilanc, i lëshon para përdoruesit. E dyta zbret shumën e kërkuar nga bilanci. Le të themi se sistemi u rrëzua dhe operacioni i parë dështoi, por i dyti dështoi. Në këtë rast, ne nuk mund t'i ri-lëshojmë para përdoruesit pa e kthyer sistemin në gjendjen e tij origjinale me një bilanc pozitiv.

Nivelet e izolimit

Lexoni të përkushtuar

Problemi i leximit të pistë është se një transaksion mund të lexojë rezultatin e ndërmjetëm të një transaksioni tjetër.

Shembull. Vlera fillestare e bilancit është $0. T1 shton 50 dollarë në bilancin tuaj. T2 lexon vlerën e bilancit (50 dollarë). T1 hedh poshtë ndryshimet dhe del. T2 vazhdon ekzekutimin me të dhëna të pasakta të bilancit.

Zgjidhja është leximi i të dhënave fikse (Read Committed), i cili ndalon leximin e të dhënave të ndryshuara nga transaksioni. Nëse transaksioni A ka ndryshuar një grup të caktuar të dhënash, atëherë transaksioni B, kur akseson këto të dhëna, detyrohet të presë që transaksioni A të përfundojë.

Leximi i përsëritur

Problemi me përditësimet e humbura. T1 ruan ndryshimet në krye të ndryshimeve të T2.

Shembull. Vlera fillestare e bilancit është $0 dhe dy transaksione e plotësojnë njëkohësisht bilancin. T1 dhe T2 lexojnë një bilanc prej $0. T2 më pas shton $200 në $0 dhe ruan rezultatin. T1 shton $100 në $0 dhe kursen rezultatin. Rezultati përfundimtar është 100 dollarë në vend të 300 dollarëve.

Problem i papërsëritshëm leximi. Leximi i të njëjtave të dhëna në mënyrë të përsëritur kthen vlera të ndryshme.

Shembull. T1 lexon një vlerë bilanci prej $0. T2 më pas shton 50 dollarë në bilanc dhe përfundon. T1 lexon përsëri të dhënat dhe gjen një mospërputhje me rezultatin e mëparshëm.

Leximi i përsëritur siguron që një lexim i dytë do të japë të njëjtin rezultat. Të dhënat e lexuara nga një transaksion nuk mund të ndryshohen në të tjerët derisa transaksioni të përfundojë. Nëse transaksioni A ka lexuar një grup të caktuar të dhënash, atëherë transaksioni B, kur akseson këto të dhëna, detyrohet të presë që transaksioni A të përfundojë.

Lexim i porositur (i serializueshëm)

Problemi i leximit të fantazmave. Dy pyetje që zgjedhin të dhëna bazuar në një kusht të caktuar kthejnë vlera të ndryshme.

Shembull. T1 kërkon numrin e të gjithë përdoruesve balanca e të cilëve është më e madhe se $0 por më pak se $100. T2 zbret $1 nga një përdorues me një bilanc prej $101. T1 riboton kërkesën.

Lexim i porositur (i serializueshëm). Transaksionet kryhen në mënyrë krejtësisht të njëpasnjëshme. Ndalohet përditësimi ose shtimi i regjistrave që përfshihen në kushtet e kërkesës. Nëse transaksioni A ka kërkuar të dhëna nga e gjithë tabela, atëherë e gjithë tabela ngrihet për transaksione të tjera derisa transaksioni A të përfundojë.

Programuesi

Vendos rendin në të cilin duhet të kryhen operacionet gjatë transaksioneve paralele.

Ofron një nivel të caktuar izolimi. Nëse rezultati i operacioneve nuk varet nga rendi i tyre, atëherë operacionet e tilla janë komutative (Permutable). Operacionet e leximit dhe operacionet në të dhëna të ndryshme janë komutative. Operacionet lexo-shkrim dhe shkrim-shkruaj nuk janë komutative. Detyra e planifikuesit është të ndërlidhë operacionet e kryera nga transaksionet paralele në mënyrë që rezultati i ekzekutimit të jetë i barabartë me ekzekutimin sekuencial të transaksioneve.

Mekanizmat për kontrollin e punëve paralele (Concurrency Control)

Optimisti bazohet në zbulimin dhe zgjidhjen e konflikteve, pesimisti bazohet në parandalimin e shfaqjes së konflikteve.

Në qasjen optimiste, përdorues të shumtë kanë në dispozicion kopje të të dhënave. Personi i parë që përfundon redaktimin i ruan ndryshimet, ndërsa të tjerët duhet t'i bashkojnë ndryshimet. Një algoritëm optimist lejon që konflikti të ndodhë, por sistemi duhet të shërohet nga konflikti.

Me një qasje pesimiste, përdoruesi i parë që kap të dhënat i pengon të tjerët të marrin të dhënat. Nëse konfliktet janë të rralla, është e mençur të zgjidhni strategjinë optimiste, pasi ajo siguron një nivel më të lartë të konkurencës.

Mbyllja

Nëse një transaksion ka të dhëna të kyçura, atëherë transaksionet e tjera duhet të presin derisa të zhbllokohet kur të aksesohen të dhënat.

Një bllok mund të mbivendoset në një bazë të dhënash, tabelë, rresht ose atribut. Shared Lock mund të vendoset në të njëjtat të dhëna nga disa transaksione, lejon të gjitha transaksionet (përfshirë atë që e ka imponuar) të lexohen, ndalon modifikimin dhe kapjen ekskluzive. Kyçja ekskluzive mund të vendoset vetëm nga një transaksion, lejon çdo veprim të transaksionit imponues, ndalon çdo veprim nga të tjerët.

Një bllokim është një situatë ku transaksionet përfundojnë në një gjendje pezull që zgjat pafundësisht.

Shembull. Transaksioni i parë pret që të dhënat e kapura nga i dyti të publikohen, ndërsa i dyti pret që të dhënat e kapura nga i pari të publikohen.

Një zgjidhje optimiste për problemin e bllokimit lejon që bllokimi të ndodhë, por më pas rikuperon sistemin duke rikthyer një nga transaksionet e përfshira në bllokim.

Blloqet kërkohen në intervale të caktuara. Një nga metodat e zbulimit është me kohë, domethënë, konsideroni se ka ndodhur një bllokim nëse transaksioni kërkon shumë kohë për t'u përfunduar. Kur gjendet një bllokim, një nga transaksionet kthehet prapa, duke lejuar që transaksionet e tjera të përfshira në bllokim të përfundojnë. Zgjedhja e viktimës mund të bazohet në vlerën e transaksioneve ose vjetërsinë e tyre (skemat Wait-Die dhe Wound-wait).

Çdo transaksion T është caktuar një vulë kohore TS që përmban kohën e fillimit të transaksionit.

Prit-Vdes.

Nëse TS (Ti) < TS (Tj), Pastaj Ti pret, ndryshe Ti kthehet prapa dhe fillon përsëri me të njëjtën vulë kohore.

Nëse një transaksion i ri ka fituar një burim dhe një transaksion më i vjetër kërkon të njëjtin burim, atëherë transaksioni më i vjetër lejohet të presë. Nëse një transaksion më i vjetër ka fituar një burim, atëherë transaksioni më i ri që kërkon atë burim do të kthehet prapa.

Plagë-prit.

Nëse TS (Ti) < TS (Tj), Pastaj Tj kthehet prapa dhe fillon përsëri me të njëjtën vulë kohore, përndryshe Ti ne pritje.

Nëse një transaksion më i ri ka fituar një burim dhe një transaksion më i vjetër kërkon të njëjtin burim, atëherë transaksioni më i ri do të rikthehet. Nëse një transaksion më i vjetër ka fituar një burim, atëherë transaksioni më i ri që kërkon atë burim lejohet të presë. Përzgjedhja e viktimës e bazuar në përparësi parandalon bllokimet, por kthen mbrapsht transaksionet që nuk janë bllokuar. Problemi është se transaksionet mund të rikthehen shumë herë sepse... një transaksion i vjetër mund të mbajë burimin për një kohë të gjatë.

Një zgjidhje pesimiste për problemin e bllokimit nuk lejon që një transaksion të fillojë të ekzekutohet nëse ekziston rreziku i një bllokimi.

Për të zbuluar një bllokim, ndërtohet një grafik (grafi i pritjes, grafik pritjeje), kulmet e të cilit janë transaksione, dhe skajet drejtohen nga transaksionet që presin lëshimin e të dhënave deri te transaksioni që ka kapur këto të dhëna. Një bllokim konsiderohet se ka ndodhur nëse grafiku ka një lak. Ndërtimi i një grafiku pritjeje, veçanërisht në bazat e të dhënave të shpërndara, është një procedurë e shtrenjtë.

Bllokimi dyfazor - parandalon bllokimet duke kapur të gjitha burimet e përdorura nga një transaksion në fillim të transaksionit dhe duke i lëshuar ato në fund

Të gjitha veprimet e bllokimit duhet t'i paraprijnë atij të parë të zhbllokimit. Ka dy faza - Faza e Rritjes, gjatë së cilës grumbullohen dorezat, dhe Faza e Tkurrjes, gjatë së cilës dorezat lëshohen. Nëse është e pamundur të kapësh një nga burimet, transaksioni fillon nga e para. Është e mundur që një transaksion të mos jetë në gjendje të marrë burimet e kërkuara, për shembull, nëse disa transaksione konkurrojnë për të njëjtat burime.

Një kryerje me dy faza siguron që commit të ekzekutohet në të gjitha kopjet e bazës së të dhënave

Çdo bazë të dhënash fut informacionin për të dhënat që do të ndryshohen në regjistër dhe i përgjigjet koordinatorit OK (Faza e Votimit). Pasi të gjithë janë përgjigjur në rregull, koordinatori dërgon një sinjal që i detyron të gjithë të angazhohen. Pas kryerjes, serverët përgjigjen OK; nëse të paktën njëri nuk përgjigjet OK, atëherë koordinatori dërgon një sinjal për të anuluar ndryshimet në të gjithë serverët (Faza e Përfundimit).

Metoda e vulës kohore

Një transaksion i vjetër rikthehet kur përpiqet të aksesojë të dhënat e përfshira nga një transaksion më i ri

Çdo transaksioni i caktohet një vulë kohore TS që korrespondon me kohën e fillimit të ekzekutimit. Nëse Ti i lartë Tj, Pastaj TS (Ti) < TS (Tj).

Kur një transaksion rikthehet, atij i caktohet një vulë e re kohore. Çdo objekt i të dhënave Q i përfshirë në transaksion është shënuar me dy etiketa. W-TS (Q) — vula kohore e transaksionit më të ri që përfundoi me sukses një rekord Q. R-TS (Q) — vula kohore e transaksionit më të ri që ka kryer një rekord leximi Q.

Kur transaksioni T kërkesat për të lexuar të dhënat Q Ka dy opsione.

Nëse TS (T) < W-TS (Q), domethënë, të dhënat u përditësuan nga një transaksion më i ri, pastaj transaksioni T rrotullohet prapa.

Nëse TS (T) >= W-TS (Q), pastaj kryhet leximi dhe R-TS (Q) po bëhet MAX(R-TS(Q), TS(T)).

Kur transaksioni T kërkon ndryshime të të dhënave Q Ka dy opsione.

Nëse TS (T) < R-TS (Q), domethënë të dhënat janë lexuar tashmë nga një transaksion më i ri dhe nëse bëhet një ndryshim, do të lindë një konflikt. Transaksioni T rrotullohet prapa.

Nëse TS (T) < W-TS (Q), domethënë, transaksioni përpiqet të mbishkruajë një vlerë më të re, transaksioni T kthehet prapa. Në raste të tjera, ndryshimi kryhet dhe W-TS (Q) bëhet e barabartë TS (T).

Nuk kërkohet ndërtim i shtrenjtë i grafikut të pritjes. Transaksionet e vjetra varen nga ato më të rejat, kështu që nuk ka cikle në grafikun e pritjes. Nuk ka ngërçe sepse transaksionet nuk priten por kthehen menjëherë. Rikthimet në kaskadë janë të mundshme. Nëse Ti u rrokullis dhe Tj Kam lexuar të dhënat që kam ndryshuar Ti, Pastaj Tj duhet gjithashtu të kthehet prapa. Nëse në të njëjtën kohë Tj tashmë është kryer, atëherë do të ketë shkelje të parimit të stabilitetit.

Një nga zgjidhjet për rikthimet në kaskadë. Një transaksion përfundon të gjitha operacionet e shkrimit në fund, dhe transaksionet e tjera duhet të presin që ai operacion të përfundojë. Transaksionet presin të kryhen përpara se të lexohen.

Rregulli i shkrimit Thomas - një variacion i metodës së vulës kohore në të cilën të dhënat e përditësuara nga një transaksion më i ri ndalohen të mbishkruhen nga një më i vjetër

Transaksioni T kërkon ndryshime të të dhënave Q. nëse TS (T) < W-TS (Q), domethënë, transaksioni përpiqet të mbishkruajë një vlerë më të re, transaksioni T nuk kthehet mbrapsht si në metodën e vulës kohore.

Burimi: www.habr.com

Shto një koment