Transakcioj kaj iliaj kontrolmekanismoj

Transakcioj

Transakcio estas sekvenco de operacioj pri datumoj, kiu havas komencon kaj finon.

Transakcio estas la sinsekva ekzekuto de legado kaj skriba operacioj. La fino de transakcio povas esti aŭ konservado de la ŝanĝoj (commit) aŭ nuligo de la ŝanĝoj (retroligo). Rilate al datumbazo, transakcio konsistas el pluraj petoj, kiuj estas traktataj kiel ununura peto.

Transakcioj devas kontentigi ACID-ecojn

Atomiko. La transakcio estas aŭ komplete aŭ tute ne.

Kohereco. Fininte transakcion, la limigoj truditaj al la datumoj (ekzemple, limoj en la datumbazo) ne devas esti malobservitaj. Konsistenco implicas ke la sistemo estos transdonita de unu ĝusta ŝtato al alia ĝusta ŝtato.

Izolo. Transakcioj kurantaj paralele ne devus influi unu la alian, ekzemple ŝanĝi datumojn uzatajn de alia transakcio. La rezulto de ekzekuto de paralelaj transakcioj devus esti la sama kvazaŭ la transakcioj estus efektivigitaj sinsekve.

Daŭripovo. Post kiam faritaj, ŝanĝoj ne devus esti perditaj.

Transakcia protokolo

La protokolo konservas ŝanĝojn faritajn per transakcioj, certigas atomecon kaj stabilecon de datumoj en kazo de fiasko de la sistemo.

La protokolo enhavas la valorojn, kiujn la datumoj havis antaŭ kaj post kiam ĝi estis ŝanĝita de la transakcio. Antaŭskribi protokolo-strategio postulas aldoni protokolan eniron pri antaŭaj valoroj antaŭ la komenco, kaj pri finaj valoroj post kiam la transakcio estas finita. En la okazo de subita halto de la sistemo, la datumbazo legas la protokolon en inversa ordo kaj nuligas la ŝanĝojn faritajn de transakcioj. Renkontinte interrompitan transakcion, la datumbazo efektivigas ĝin kaj faras ŝanĝojn pri ĝi al la protokolo. Estante en la stato en la momento de la malsukceso, la datumbazo legas la protokolon en antaŭa ordo kaj resendas la ŝanĝojn faritajn de transakcioj. Tiel, la stabileco de transakcioj kiuj jam estis faritaj kaj la atomeco de la interrompita transakcio estas konservitaj.

Simple reefektivi malsukcesaj transakcioj ne sufiĉas por reakiro.

Ekzemplo. La uzanto havas $500 en sia konto kaj la uzanto decidas retiri ĝin de ATM. Du transakcioj estas en progreso. La unua legas la ekvilibran valoron kaj se estas sufiĉe da financo sur la ekvilibro, ĝi elsendas monon al la uzanto. La dua subtrahas la bezonatan kvanton de la bilanco. Ni diru, ke la sistemo kraŝis kaj la unua operacio malsukcesis, sed la dua faris. En ĉi tiu kazo, ni ne povas reeldoni monon al la uzanto sen resendi la sistemon al ĝia originala stato kun pozitiva saldo.

Izolaj niveloj

Legu Engaĝita

La Malpura Legita problemo estas, ke transakcio povas legi la mezan rezulton de alia transakcio.

Ekzemplo. La komenca ekvilibrovaloro estas $0. T1 aldonas $50 al via saldo. T2 legas la ekvilibran valoron ($50). T1 forĵetas la ŝanĝojn kaj eliras. T2 daŭrigas ekzekuton kun malĝustaj ekvilibraj datumoj.

La solvo estas legi fiksajn datumojn (Read Committed), kiu malpermesas legi datumojn ŝanĝitajn de la transakcio. Se transakcio A ŝanĝis certan aron da datumoj, tiam transakcio B, alirante ĉi tiujn datumojn, estas devigita atendi ke transakcio A finiĝos.

Ripetebla Legado

Problemo de Perditaj Ĝisdatigoj. T1 konservas ŝanĝojn aldone al la ŝanĝoj de T2.

Ekzemplo. La komenca ekvilibrovaloro estas $0 kaj du transakcioj samtempe replenigas la ekvilibron. T1 kaj T2 legas saldon de $0. T2 tiam aldonas $200 al $0 kaj konservas la rezulton. T1 aldonas $100 al $0 kaj konservas la rezulton. La fina rezulto estas $100 anstataŭ $300.

Neripetebla problemo de legado. Legante la samajn datumojn plurfoje donas malsamajn valorojn.

Ekzemplo. T1 legas ekvilibran valoron de $0. T2 tiam aldonas $50 al la saldo kaj finiĝas. T1 denove legas la datumojn kaj trovas diferencon kun la antaŭa rezulto.

Ripetebla Legado certigas, ke dua legado resendos la saman rezulton. Datumoj legitaj de unu transakcio ne povas esti ŝanĝitaj en aliaj ĝis la transakcio finiĝos. Se transakcio A legis certan aron da datumoj, tiam transakcio B, alirante ĉi tiujn datumojn, estas devigita atendi ke transakcio A finiĝos.

Ordita legado (Seriigebla)

Problemo de Phantom Reads. Du demandoj, kiuj elektas datumojn surbaze de certa kondiĉo, resendas malsamajn valorojn.

Ekzemplo. T1 petas la nombron de ĉiuj uzantoj, kies saldo estas pli granda ol $0 sed malpli ol $100. T2 subtrahas $1 de uzanto kun saldo de $101. T1 reeldonas la peton.

Ordigita legado (Seriigebla). Transakcioj estas efektivigitaj kiel tute sinsekvaj. Estas malpermesite ĝisdatigi aŭ aldoni rekordojn kiuj estas en la kondiĉoj de la peto. Se transakcio A petis datumojn de la tuta tablo, tiam la tuta tablo estas frostigita por aliaj transakcioj ĝis transakcio A finiĝas.

Planilo

Fiksas la ordon en kiu operacioj devas esti faritaj dum paralelaj transakcioj.

Provizas specifan nivelon de izolado. Se la rezulto de operacioj ne dependas de ilia ordo, tiam tiaj operacioj estas komutaj (Permutable). Legaj operacioj kaj operacioj sur malsamaj datumoj estas komutaj. Leg-skribi kaj skribi-skriba operacioj ne estas komutaj. La tasko de la planisto estas interpleki operaciojn faritajn per paralelaj transakcioj tiel ke la ekzekutrezulto estas ekvivalenta al sinsekva plenumo de transakcioj.

Mekanismoj por kontroli paralelajn laborpostenojn (Konkurso-Kontrolo)

Optimisma baziĝas sur detektado kaj solvado de konfliktoj, pesimisma baziĝas sur malhelpado de konfliktoj.

En la optimisma aliro, multoblaj uzantoj havas kopiojn de la datumoj je sia dispono. La unua persono kompletiganta redaktadon konservas la ŝanĝojn, dum la aliaj devas kunfandi la ŝanĝojn. Optimisma algoritmo permesas konflikton okazi, sed la sistemo devas renormaliĝi post la konflikto.

Kun pesimisma aliro, la unua uzanto kiu kaptas la datumojn malhelpas aliajn ricevi la datumojn. Se konfliktoj estas maloftaj, estas saĝe elekti la optimisman strategion, ĉar ĝi provizas pli altan nivelon de samtempeco.

Ŝlosado

Se unu transakcio havas ŝlositajn datumojn, tiam aliaj transakcioj devas atendi ĝis ĝi estas malŝlosita dum aliro al la datumoj.

Bloko povas esti supermetita sur datumbazo, tablo, vico aŭ atributo. Komuna Ŝlosilo povas esti trudita al la samaj datumoj per pluraj transakcioj, permesas ĉiujn transakciojn (inkluzive de tiu, kiu trudis ĝin) legi, malpermesas modifon kaj ekskluzivan kapton. Ekskluziva Seruro povas esti trudita de nur unu transakcio, permesas iujn ajn agojn de la impona transakcio, malpermesas ajnajn agojn de aliaj.

Blokiĝo estas situacio, kie transakcioj finiĝas en pritraktata stato, kiu daŭras senfine.

Ekzemplo. La unua transakcio atendas ke la datumoj kaptitaj de la dua estu liberigitaj, dum la dua atendas ke la datumoj kaptitaj de la unua estu liberigitaj.

Optimisma solvo al la blokiĝo problemo permesas al la blokiĝo okazi, sed tiam reakiras la sistemon retroirante unu el la transakcioj implikitaj en la blokiĝo.

Interblokoj estas serĉataj je certaj intervaloj. Unu el la detektaj metodoj estas laŭ tempo, tio estas, konsideru, ke blokiĝo okazis se la transakcio daŭras tro longe por kompletigi. Kiam blokiĝo estas trovita, unu el la transakcioj retroiras, permesante aliajn transakciojn implikitajn en la blokiĝo finiĝi. La elekto de viktimo povas esti bazita sur la valoro de transakcioj aŭ ilia antikva tempo (Wait-Die kaj Wound-wait-skemoj).

Ĉiu transakcio T tempomarko estas asignita TS enhavanta la komencan tempon de la transakcio.

Atendu-Mortu.

se TS(Ti) < TS(Tj), tiam Ti atendas, alie Ti ruliĝas reen kaj rekomencas kun la sama tempomarko.

Se juna transakcio akiris rimedon kaj pli malnova transakcio petas la saman rimedon, tiam la pli malnova transakcio rajtas atendi. Se pli malnova transakcio akiris rimedon, tiam la pli juna transakcio petanta tiun rimedon estos nuligita.

Vund-atendo.

se TS(Ti) < TS(Tj), tiam Tj ruliĝas reen kaj rekomencas per la sama tempomarko, alie Ti atendante.

Se pli juna transakcio akiris rimedon kaj pli malnova transakcio petas la saman rimedon, tiam la pli juna transakcio estos nuligita. Se pli malnova transakcio akiris rimedon, tiam la pli juna transakcio petanta tiun rimedon rajtas atendi. Selektado de viktimoj bazitaj en precedenco malhelpas blokiĝon, sed restarigas transakciojn, kiuj ne estas blokitaj. La problemo estas, ke transakcioj povas esti reproduktitaj multfoje ĉar... pli malnova transakcio povas teni la rimedon dum longa tempo.

Pesimisma solvo al la problemo de blokiĝo ne permesas ke transakcio komenciĝu se ekzistas risko de blokiĝo.

Por detekti blokiĝon, grafeo estas konstruita (atenda grafeo, atendo-por-grafo), kies verticoj estas transakcioj, kaj la randoj estas direktitaj de transakcioj atendantaj la liberigon de datumoj al la transakcio kiu kaptis ĉi tiujn datumojn. Blokiĝo estas konsiderita esti okazinta se la grafeo havas buklon. Konstrui atendan grafeon, precipe en distribuitaj datumbazoj, estas multekosta proceduro.

Dufaza ŝlosado - malhelpas blokiĝon kaptante ĉiujn rimedojn uzatajn de transakcio komence de la transakcio kaj liberigante ilin fine

Ĉiuj blokaj operacioj devas antaŭi la unuan malŝlosadon. Ĝi havas du fazojn - Growing Phase, dum kiu la kroĉaĵoj amasiĝas, kaj Shrinking Phase, dum kiu la kroĉaĵoj estas liberigitaj. Se estas neeble kapti unu el la rimedoj, la transakcio rekomencas. Eblas, ke transakcio ne povos akiri la postulatajn rimedojn, ekzemple, se pluraj transakcioj konkuras por la samaj rimedoj.

Dufaza kommit certigas ke la kommit estas efektivigita sur ĉiuj datumbazkopioj

Ĉiu datumbazo enmetas informojn pri la datumoj kiuj estos ŝanĝitaj en la protokolo kaj respondas al la kunordiganto OK (Voĉdona Fazo). Post kiam ĉiuj respondis Bone, la kunordiganto sendas signalon devigante ĉiujn engaĝiĝi. Post transiĝo, la serviloj respondas Bone; se almenaŭ unu ne respondas Bone, tiam la kunordiganto sendas signalon por nuligi la ŝanĝojn al ĉiuj serviloj (Completion Phase).

Tempstampo-metodo

Pli malnova transakcio estas reigita kiam oni provas aliri datumojn implikitajn de pli juna transakcio

Ĉiu transakcio estas asignita tempomarko TS responda al la komenca tempo de ekzekuto. Se Ti pli maljuna Tj, tiam TS(Ti) < TS(Tj).

Kiam transakcio estas refarita, ĝi ricevas novan tempomarkon. Ĉiu datuma objekto Q implikita en la transakcio estas markita per du etikedoj. W-TS(Q) — tempomarko de la plej juna transakcio, kiu sukcese kompletigis rekordon Q. R-TS(Q) — tempomarko de la plej juna transakcio sur kiu faris legitan rekordon Q.

Kiam la transakcio T petoj legi datumojn Q Estas du opcioj.

se TS(T) < W-TS(Q), tio estas, la datumoj estis ĝisdatigitaj de pli juna transakcio, tiam la transakcio T ruliĝas reen.

se TS(T) >= W-TS(Q), tiam la legado estas farita kaj R-TS(Q) iĝas MAX(R-TS(Q), TS(T)).

Kiam la transakcio T petas datumojn ŝanĝojn Q Estas du opcioj.

se TS(T) < R-TS(Q), tio estas, la datumoj jam estis legitaj de pli juna transakcio kaj se ŝanĝo estas farita, konflikto aperos. Transakcio T ruliĝas reen.

se TS(T) < W-TS(Q), tio estas, la transakcio provas anstataŭi pli novan valoron, transakcio T estas rerulita. En aliaj kazoj, la ŝanĝo estas efektivigita kaj W-TS(Q) iĝas egala TS(T).

Ne necesas multekosta atenda grafika konstruo. Pli malnovaj transakcioj dependas de pli novaj, do ne estas cikloj en la atenda grafiko. Ne estas blokiĝo, ĉar transakcioj ne estas atendataj sed tuj retrovigitaj. Kaskadaj retrovojoj estas eblaj. Se Ti ruliĝis for kaj Tj Mi legis la datumojn, kiujn mi ŝanĝis Ti, tiam Tj ankaŭ devus retroiri. Se samtempe Tj jam estas farita, tiam estos malobservo de la principo de stabileco.

Unu el la solvoj al kaskadaj retrovojoj. Transakcio kompletigas ĉiujn skribajn operaciojn ĉe la fino, kaj aliaj transakcioj devas atendi ke tiu operacio finiĝos. Transakcioj atendas esti faritaj antaŭ esti legitaj.

Tomaso-skriba regulo - vario de la tempomarko-metodo en kiu datumoj ĝisdatigitaj de pli juna transakcio estas malpermesitaj esti anstataŭitaj de pli malnova.

Transakcio T petas datumojn ŝanĝojn Q. Se TS(T) < W-TS(Q), tio estas, la transakcio provas anstataŭi pli novan valoron, transakcio T ne estas reruligita kiel en la tempostampo-metodo.

fonto: www.habr.com

Aldoni komenton