Transaksjes en harren kontrôle meganismen

Transaksjes

In transaksje is in folchoarder fan operaasjes op gegevens dy't in begjin en in ein hat.

In transaksje is de opienfolgjende útfiering fan lês- en skriuwoperaasjes. It ein fan in transaksje kin wêze as it bewarjen fan de wizigingen (commit) of it annulearjen fan de wizigingen (rollback). Yn relaasje ta in databank bestiet in transaksje út ferskate oanfragen dy't wurde behannele as ien fersyk.

Transaksjes moatte foldwaan oan ACID-eigenskippen

Atomiteit. De transaksje is folslein of hielendal net foltôge.

Konsistinsje. By it foltôgjen fan in transaksje moatte de beheiningen oplein oan de gegevens (bygelyks beheiningen yn 'e databank) net oertrêden wurde. Konsistinsje hâldt yn dat it systeem sil wurde oerbrocht fan de iene korrekte steat nei in oare korrekte steat.

Isolaasje. Transaksjes dy't parallel rinne, moatte inoar net beynfloedzje, bygelyks feroarje gegevens brûkt troch in oare transaksje. It resultaat fan it útfieren fan parallelle transaksjes moat itselde wêze as as de transaksjes sequentially útfierd wurde.

Duorsumens. Ien kear ynset, moatte feroarings net ferlern gean.

Transaksje log

It log bewarret feroaringen makke troch transaksjes, soarget foar atomiteit en stabiliteit fan gegevens yn gefal fan in systeemfal

It log befettet de wearden dy't de gegevens hiene foar en nei't se waarden feroare troch de transaksje. Write-ahead logstrategy fereasket it tafoegjen fan in logyngong oer eardere wearden foar it begjin, en oer definitive wearden neidat de transaksje is foltôge. Yn it gefal fan in hommelse stop fan it systeem lêst de databank it log yn omkearde folchoarder en annulearret de wizigingen makke troch transaksjes. Nei't er in ûnderbrutsen transaksje tsjinkaam, fiert de databank it út en makket der feroaringen oer yn it log. Om yn 'e steat te wêzen op' e tiid fan it mislearjen, lêst de databank it log yn 'e foarút folchoarder en jout de wizigingen werom makke troch transaksjes. Op dizze manier wurde de stabiliteit fan transaksjes dy't al ynset binne en de atomiteit fan 'e ûnderbrutsen transaksje bewarre bleaun.

It gewoan opnij útfiere fan mislearre transaksjes is net genôch foar herstel.

Foarbyld. De brûker hat $ 500 yn syn akkount en de brûker beslút it werom te lûken fan in pinautomaat. Twa transaksjes binne oan 'e gong. De earste lêst de balânswearde en as d'r genôch fûnsen op 'e balâns binne, jout it jild út oan' e brûker. De twadde subtracts it fereaske bedrach fan it saldo. Litte wy sizze dat it systeem crashte en de earste operaasje mislearre, mar de twadde die. Yn dit gefal kinne wy ​​gjin jild opnij útjaan oan de brûker sûnder it systeem werom te jaan nei syn oarspronklike steat mei in posityf saldo.

Isolaasje nivo's

Lês Committed

It Dirty Read-probleem is dat in transaksje it tuskenresultaat fan in oare transaksje lêze kin.

Foarbyld. De earste balâns wearde is $ 0. T1 foeget $ 50 ta oan jo lykwicht. T2 lêst de balâns wearde ($ 50). T1 smyt de feroarings en útgongen. T2 bliuwt útfiering mei ferkearde balâns gegevens.

De oplossing is om fêste gegevens te lêzen (Read Committed), dy't it lêzen fan gegevens ferbean feroare troch de transaksje. As transaksje A in bepaalde set gegevens feroare hat, dan wurdt transaksje B, by tagong ta dizze gegevens, twongen om te wachtsjen foar transaksje A om te foltôgjen.

Repeatable Read

Ferlern Updates probleem. T1 bewarret feroaringen boppe op T2's feroarings.

Foarbyld. De earste balânswearde is $ 0 en twa transaksjes jouwe tagelyk it lykwicht oan. T1 en T2 lêze in saldo fan $0. T2 foeget dan $ 200 oan $ 0 ta en bewarret it resultaat. T1 foeget $ 100 oan $ 0 en bewarret it resultaat. It einresultaat is $100 ynstee fan $300.

Unrepeatable lêsprobleem. It lêzen fan deselde gegevens ferskate kearen jout ferskillende wearden.

Foarbyld. T1 lêst in balânswearde fan $0. T2 foeget dan $ 50 ta oan it lykwicht en einiget. T1 lêst de gegevens wer en fynt in diskrepânsje mei it foarige resultaat.

Repeatable Read soarget derfoar dat in twadde lêzing itselde resultaat sil jaan. Gegevens lêzen troch ien transaksje kinne net feroare wurde yn oaren oant de transaksje is foltôge. As transaksje A in bepaalde set gegevens hat lêzen, dan wurdt transaksje B, by tagong ta dizze gegevens, twongen om te wachtsjen foar transaksje A om te foltôgjen.

Bestelde lêzing (Serializable)

Phantom Reads probleem. Twa fragen dy't gegevens selektearje op basis fan in bepaalde betingst jouwe ferskillende wearden werom.

Foarbyld. T1 freget it oantal fan alle brûkers waans saldo grutter is dan $0, mar minder dan $100. T2 lûkt $ 1 ôf fan in brûker mei in saldo fan $ 101. T1 jout it fersyk opnij út.

Bestelde lêzing (Serializable). Transaksjes wurde útfierd as folslein sekwinsjele. It is ferbean om records te aktualisearjen of ta te foegjen dy't binnen de betingsten fan it fersyk falle. As transaksje A hat frege gegevens út de hiele tabel, dan is de hiele tabel beferzen foar oare transaksjes oant transaksje A foltôging.

Planner

Stelt de folchoarder yn wêryn operaasjes moatte wurde útfierd tidens parallelle transaksjes.

Biedt in spesifisearre nivo fan isolemint. As it resultaat fan operaasjes net ôfhinklik is fan har folchoarder, dan binne sokke operaasjes kommutatyf (Permutable). Lêzen operaasjes en operaasjes op ferskillende gegevens binne commutative. Lêzen-skriuwe en skriuwe-skriuwe operaasjes binne net kommutatyf. De taak fan 'e planner is om operaasjes dy't útfierd wurde troch parallelle transaksjes te interleave, sadat it útfieringsresultaat lykweardich is mei opfolgjende útfiering fan transaksjes.

Mechanismen foar it kontrolearjen fan parallelle banen (Concurrency Control)

Optimistysk is basearre op it opspoaren en oplossen fan konflikten, pessimistysk is basearre op it foarkommen fan konflikten.

Yn 'e optimistyske oanpak hawwe meardere brûkers kopyen fan' e gegevens ta har beskikking. De earste persoan om it bewurkjen te foltôgjen, bewarret de wizigingen, wylst de oaren de wizigingen gearfoegje moatte. In optimistysk algoritme lit konflikt foarkomme, mar it systeem moat herstelle fan it konflikt.

Mei in pessimistyske oanpak foarkomt de earste brûker om de gegevens te fangen oaren de gegevens te ûntfangen. As konflikten seldsum binne, is it ferstannich om de optimistyske strategy te kiezen, om't it in heger nivo fan gearhing leveret.

Locking

As ien transaksje gegevens beskoattele hat, dan moatte oare transaksjes wachtsje oant it is ûntskoattele by it tagong ta de gegevens.

In blok kin oerlein wurde op in databank, tabel, rige of attribút. Shared Lock kin oplein wurde op deselde gegevens troch ferskate transaksjes, kinne alle transaksjes (ynklusyf dejinge dy't oplein it) te lêzen, ferbiedt modifikaasje en eksklusive capture. Exclusive Lock kin wurde oplein troch mar ien transaksje, lit alle aksjes fan de ymposante transaksje, ferbiedt alle aksjes troch oaren.

In deadlock is in situaasje dêr't transaksjes einigje yn in oanhâldende steat dy't foar ûnbepaalde tiid duorret.

Foarbyld. De earste transaksje wachtet foar de gegevens fêstlein troch de twadde om frijlitten te wurden, wylst de twadde wachtet foar de gegevens dy't troch de earste binne frijlitten.

In optimistyske oplossing foar it deadlock-probleem lit de deadlock foarkomme, mar herstelt it systeem dan troch ien fan 'e transaksjes dy't belutsen binne by de deadlock werom te rôljen.

Deadlocks wurde socht op bepaalde yntervallen. Ien fan 'e deteksjemetoaden is troch tiid, dat is, beskôgje dat in deadlock is bard as de transaksje te lang duorret om te foltôgjen. As in deadlock wurdt fûn, wurdt ien fan 'e transaksjes weromrôle, wêrtroch oare transaksjes belutsen by de deadlock kinne foltôgje. De kar fan it slachtoffer kin basearre wurde op 'e wearde fan transaksjes of har senioriteit (Wait-Die en Wound-wait schemes).

Elke transaksje T in tiidstempel wurdt tawiisd TS befettet de starttiid fan de transaksje.

Wachtsje-die.

as TS(Ti) < TS(Tj), dan Ti wachtet, oars Ti rôlet werom en begjint wer mei deselde tiidstempel.

As in jonge transaksje in boarne hat krigen en in âldere transaksje freget deselde boarne, dan kin de âldere transaksje wachtsje. As in âldere transaksje in boarne hat krigen, dan sil de jongere transaksje dy't dy boarne freget, weromdraaid wurde.

Wûn-wachtsje.

as TS(Ti) < TS(Tj), dan Tj rôlet werom en begjint wer mei deselde tiidstempel, oars Ti wachtsjend.

As in jongere transaksje in boarne hat krigen en in âldere transaksje deselde boarne freget, dan sil de jongere transaksje weromdraaid wurde. As in âldere transaksje in boarne hat krigen, dan kin de jongere transaksje dy't dy boarne freget wachtsje. Foarrang-basearre slachtoffer seleksje foarkomt deadlocks, mar rôlet werom transaksjes dy't net deadlocked. It probleem is dat transaksjes in protte kearen kinne wurde weromdraaid omdat ... in âldere transaksje kin de boarne foar in lange tiid hâlde.

In pessimistyske oplossing foar it deadlock-probleem lit in transaksje net begjinne mei útfiering as d'r in risiko is fan in deadlock.

Om in deadlock te ûntdekken, wurdt in grafyk konstruearre (wachtgrafyk, wachtsjen-foar-grafyk), wêrfan de hoekpunten transaksjes binne, en de rânen wurde rjochte fan transaksjes dy't wachtsje op de frijlitting fan gegevens nei de transaksje dy't dizze gegevens hat fêstlein. In deadlock wurdt beskôge as bard as de grafyk in lus hat. It bouwen fan in wachtgrafyk, benammen yn ferdielde databases, is in djoere proseduere.

Twa-faze beskoattelje - foarkomt deadlocks troch alle boarnen dy't brûkt wurde troch in transaksje oan it begjin fan 'e transaksje yn beslach te nimmen en se oan 'e ein frij te litten

Alle blokkearjende operaasjes moatte foarôfgean oan it earste ûntskoatteljen. It hat twa fazen - Growing Phase, wêryn't de gripen accumulearje, en Shrinking Phase, wêryn't de grips wurde frijlitten. As it ûnmooglik is om ien fan 'e boarnen te fangen, begjint de transaksje opnij. It is mooglik dat in transaksje de fereaske boarnen net kin krije, bygelyks as ferskate transaksjes konkurrearje foar deselde boarnen.

In twa-fase commit soarget derfoar dat de commit wurdt útfierd op alle database replika's

Eltse databank fiert ynformaasje oer de gegevens dy't sille wurde feroare yn it log en reagearret op de koördinator OK (Stimfase). Nei't elkenien OK hat reagearre, stjoert de koördinator in sinjaal dat elkenien ferplichtet om te dwaan. Nei it begean, reagearje de servers OK as op syn minst ien net OK reagearret, dan stjoert de koördinator in sinjaal om de wizigingen oan alle servers te annulearjen (Completion Phase).

Timestamp metoade

In âldere transaksje wurdt weromrôle as jo besykje tagong te krijen ta gegevens belutsen by in jongere transaksje

Elke transaksje wurdt tawiisd in tiidstempel TS oerienkomt mei de starttiid fan útfiering. As Ti âlder Tj, dan TS(Ti) < TS(Tj).

As in transaksje wurdt weromrôle, wurdt it in nij tiidstempel tawiisd. Elts data foarwerp Q belutsen by de transaksje is markearre mei twa labels. W-TS(Q) - tiidstempel fan 'e jongste transaksje dy't in rekord mei súkses foltôge Q. R-TS(Q) - tiidstempel fan 'e jongste transaksje dy't in lêsrecord hat útfierd Q.

Wannear't de transaksje T fersiken om gegevens te lêzen Q Der binne twa opsjes.

as TS(T) < W-TS(Q), dat is, de gegevens waarden bywurke troch in jongere transaksje, dan de transaksje T rôlet werom.

as TS(T) >= W-TS(Q), dan wurdt it lêzen útfierd en R-TS(Q) is gewoan MAX(R-TS(Q), TS(T)).

Wannear't de transaksje T freget gegevens feroarings Q Der binne twa opsjes.

as TS(T) < R-TS(Q), dat is, de gegevens binne al lêzen troch in jongere transaksje en as der in feroaring makke wurdt, sil in konflikt ûntstean. Transaksje T rôlet werom.

as TS(T) < W-TS(Q), dat is, de transaksje besiket in nijere wearde te oerskriuwen, transaksje T wurdt weromrôle. Yn oare gefallen, de feroaring wurdt útfierd en W-TS(Q) wurdt gelyk TS(T).

Gjin djoere wachtsjen grafyk konstruksje is nedich. Aldere transaksjes binne ôfhinklik fan nijere, dus d'r binne gjin syklusen yn 'e wachtgrafyk. D'r binne gjin deadlocks, om't transaksjes net wurde wachte, mar fuortendaliks weromdraaid. Cascading rollbacks binne mooglik. As Ti rôle fuort en Tj Ik lês de gegevens dy't ik feroare Ti, dan Tj moat ek rôlje werom. As tagelyk Tj al begien is, dan komt der in ynbreuk op it prinsipe fan stabiliteit.

Ien fan 'e oplossingen foar cascadearjende rollbacks. In transaksje foltôget alle skriuwoperaasjes oan 'e ein, en oare transaksjes moatte wachtsje foar dizze operaasje om te foltôgjen. Transaksjes wachtsje om te wurde begien foardat se wurde lêzen.

Thomas skriuwregel - in fariaasje fan 'e tiidstempelmetoade wêryn gegevens bywurke troch in jongere transaksje ferbean wurde oerskreaun troch in âldere

Transaksje T freget gegevens feroarings Q. As TS(T) < W-TS(Q), dat is, de transaksje besiket in nijere wearde te oerskriuwen, transaksje T wurdt net weromrôle lykas yn 'e tiidstempelmetoade.

Boarne: www.habr.com

Add a comment