Kio povas rezulti el malfortigo de la transakcia izoliteca nivelo en datumbazoj?

Saluton al ĉiuj. Vladislav Rodin estas en kontakto. Nuntempe mi estas la Kursgvidanto por la kurso de Alta Laborŝarĝa Arkitekto ĉe OTUS kaj ankaŭ instruas kursojn pri programaro-arkitekturo.

Krom instruado, kiel vi eble rimarkis, mi verkas originalan materialon por la blogo de OTUS ĉe Habré kaj mi volas koincidi kun la hodiaŭa artikolo por koincidi kun la lanĉo de la kurso. "PostgreSQL", kiu estas malfermita por aliĝo ĝuste nun.

Kio povas rezulti el malfortigo de la transakcia izoliteca nivelo en datumbazoj?

Enkonduko

В lastfoje ni parolis pri la fakto, ke transakcioj en datumbazoj servas por solvi du problemojn: certigi misfunkciadon kaj aliron al datumoj en konkurenciva medio. Por plene plenumi ĉi tiujn taskojn, la transakcio devas havi ACID-propraĵojn. Hodiaŭ ni detale parolos pri la letero mi (izolado) en ĉi tiu mallongigo.

Izolado

Izoliĝo solvas la problemon de aliro de datumoj en konkurenciva medio, esence disponigante protekton kontraŭ raskondiĉoj. Ideale, izolado signifas seriigon, kio estas posedaĵo, kiu certigas, ke la rezulto de efektivigado de transakcioj paralele estas la sama kvazaŭ ili estus ekzekutitaj sinsekve. La ĉefa problemo kun ĉi tiu posedaĵo estas, ke ĝi estas tre malfacile provizi teknike kaj, kiel rezulto, havas signifan efikon al sistema rendimento. Tial izolado estas ofte malfortigita, akceptante la riskojn de certaj anomalioj, kiuj estos diskutitaj sube. La ebleco de iuj anomalioj okazantaj ĝuste karakterizas la nivelon de transakcia izolado.

La plej konataj anomalioj estas: malpura legado, neripetebla legado, fantoma legado, sed fakte estas 5 pliaj: malpura skribo, kursoro perdita ĝisdatigo, perdita ĝisdatigo, legado skew, skriba skew.

Malpura skribo

La esenco de la anomalio estas, ke transakcioj povas anstataŭigi neengaĝitajn datumojn.

Kio povas rezulti el malfortigo de la transakcia izoliteca nivelo en datumbazoj?

Ĉi tiu anomalio estas danĝera ne nur ĉar datumoj povas konflikti post farado de ambaŭ transakcioj (kiel en la bildo), sed ankaŭ ĉar atomeco estas malobservita: ĉar ni permesas neengaĝitajn datumojn esti anstataŭigataj, ne estas klare kiel refari unu transakcion sen tuŝi alian. .

La anomalio povas esti traktita tute simple: ni almetas seruron al la rekordo antaŭ ol komenci la registradon, malpermesante aliajn transakciojn ŝanĝi la rekordon ĝis la seruro estas forigita.

Malpura legado

Malpura legado signifas legi neengaĝitajn datumojn.

Kio povas rezulti el malfortigo de la transakcia izoliteca nivelo en datumbazoj?

Problemoj ekestas kiam agoj aŭ decidoj devas esti faritaj surbaze de la specimeno.

Por korekti la anomalion, vi povas alfiksi legan seruron, sed ĉi tio multe influos rendimenton. Estas multe pli simple diri, ke por retroigo de transakcio, la komenca stato de la datumoj (antaŭ la komenco de registrado) devas esti konservita en la sistemo. Kial ne legi de tie? Estas sufiĉe malmultekosta ke la plej multaj datumbazoj forigas malpuran legadon defaŭlte.

Perdita ĝisdatigo

Perdita ĝisdatigo signifas perditajn ĝisdatigojn, kaj la traduko sufiĉe precize reflektas la esencon de la problemo:

Kio povas rezulti el malfortigo de la transakcia izoliteca nivelo en datumbazoj?

Fakte, la rezulto de transakcio T2 estis inversigita. Ĉi tiu situacio povas esti korektita per eksplicitaj aŭ implicaj skribseruroj. Tio estas, ni aŭ simple ĝisdatigas la rekordon, kaj tiam implicita seruro okazas, aŭ ni plenumas elektu por ĝisdatigo, kaŭzante legadon kaj skriban seruron okazi. Bonvolu noti, ke tia operacio estas sufiĉe danĝera: per nia "senkulpa" legado, ni blokas aliajn legaĵojn. Iuj datumbazoj ofertas pli sekurajn elektu por kunhavigi, permesante al datumoj legi sed ne modifi.

Kursoro perdis ĝisdatigon

Por pli bona kontrolo, bazoj povas oferti aliajn ilojn, kiel kursoron. Kursoro estas strukturo, kiu enhavas aron da vicoj kaj ebligas al vi ripetadi super ili. deklaru cursor_name por select_statement. La enhavo de la kursoro estas priskribita per elekto.

Kial vi bezonas kursoron? La fakto estas, ke iuj datumbazoj proponas seruro sur ĉiuj registroj elektitaj de elekta (legu stabileco), aŭ nur sur la registro sur kiu la kursoro nuntempe situas (kursoro stabileco). Kun kursora stabileco, mallonga seruro estas efektivigita, kio permesas al ni redukti la nombron da seruroj se ni ripetas super granda specimeno de datumoj. Tial, la perdita ĝisdatigo anomalio estas izolita aparte por la kursoro.

Ne-ripetebla legado

Ne-ripetebla legado estas, ke dum la ekzekuto de nia transakcio, 2 sinsekvaj legoj de la sama rekordo kondukos al malsamaj rezultoj, ĉar alia transakcio intervenis inter ĉi tiuj du legoj, ŝanĝis niajn datumojn kaj estis farita.

Kio povas rezulti el malfortigo de la transakcia izoliteca nivelo en datumbazoj?

Kial ĉi tio eĉ estas problemo? Imagu, ke la celo de transakcio T2 en la bildo estas elekti ĉiujn varojn, kies prezo estas malpli ol 150 USD. Iu alia ĝisdatigis la prezon al $200. Tiel, la instalita filtrilo ne funkciis.

Ĉi tiuj anomalioj ĉesas okazi kiam dufazaj interblokoj estas aldonitaj aŭ kiam la MVCC-mekanismo estas uzata, kiun mi ŝatus diskuti aparte.

Fantomo legis

Fantomo estas legado de datumoj aldonitaj de alia transakcio.

Kio povas rezulti el malfortigo de la transakcia izoliteca nivelo en datumbazoj?

Ekzemple, ni povas observi la malĝustan elekton de la plej malmultekosta produkto kiam ĉi tiu anomalio okazas.

Forigi fantomajn legaĵojn jam estas sufiĉe malfacila. Regula blokado ne sufiĉas, ĉar ni ne povas bloki ion, kio ankoraŭ ne ekzistas. 2PL-sistemoj uzas prognozan ŝlosadon, dum MVCC-sistemoj havas transakcian planilon, kiu retroiras transakciojn, kiuj eble estos interrompitaj per enigaĵo. Kaj la unua kaj dua mekanismoj estas sufiĉe pezaj.

Legu skew

Legita skew okazas kiam ni laboras kun pluraj tabeloj, kies enhavo devas ŝanĝi konsekvence.

Ni diru, ke ni havas tabelojn reprezentantajn afiŝojn kaj iliajn metainformojn:

Kio povas rezulti el malfortigo de la transakcia izoliteca nivelo en datumbazoj?

Unu transakcio legas el la tabeloj, la alia modifas ilin:

Kio povas rezulti el malfortigo de la transakcia izoliteca nivelo en datumbazoj?

Kiel rezulto de transakcio T1, la afiŝo havas titolon = Bonon, kaj ĝisdatigita_per = T2, kio estas ia malkongruo.

Fakte, ĉi tio estas neripetebla legado, sed kiel parto de pluraj tabeloj.

Por ripari ĉi tion, T1 povas meti serurojn sur ĉiujn vicojn, kiujn ĝi legos, kio malhelpos transakcion T2 ŝanĝi la informojn. En kazo de MVCC, la transakcio T2 estos nuligita. Protekto kontraŭ ĉi tiu anomalio povas fariĝi grava se ni uzas kursorojn.

Skribu skew

Ĉi tiu anomalio ankaŭ estas pli facile klarigebla per ekzemplo: supozu, ke en nia sistemo almenaŭ unu kuracisto devus deĵori, sed ambaŭ kuracistoj decidis nuligi sian devon:

Kio povas rezulti el malfortigo de la transakcia izoliteca nivelo en datumbazoj?

Kio povas rezulti el malfortigo de la transakcia izoliteca nivelo en datumbazoj?

La anomalio signifis, ke neniu el la kuracistoj deĵorus. Kial ĉi tio okazis? Ĉar la transakcio kontrolis kondiĉon, kiu povus esti malobservita de alia transakcio, kaj pro izolado ni ne vidis ĉi tiun ŝanĝon.

Ĉi tio estas la sama neripetebla legado. Alternative, elektitaj povas meti serurojn sur ĉi tiujn rekordojn.

Skribu skew kaj legi skew estas kombinaĵoj de la antaŭaj anomalioj. Vi povas konsideri skribi skew, kiu estas esence fantoma legado. Konsideru tabelon, kiu enhavas la nomojn de dungitoj, iliajn salajrojn kaj la projekton pri kiu ili laboras:

Kio povas rezulti el malfortigo de la transakcia izoliteca nivelo en datumbazoj?

Kio povas rezulti el malfortigo de la transakcia izoliteca nivelo en datumbazoj?

Kiel rezulto, ni ricevas la sekvan bildon: ĉiu manaĝero opiniis, ke ilia ŝanĝo ne kondukos al superbuĝeto, do ili faris personajn ŝanĝojn, kiuj kune kaŭzis kostajn superfluojn.

La kaŭzo de la problemo estas ĝuste la sama kiel en fantoma legado.

trovoj

Malstreĉigi la transakcian izolitecan nivelon en la datumbazo estas kompromiso inter sekureco kaj efikeco; la elekto de ĉi tiu nivelo devus esti kontaktita surbaze de la eblaj riskoj al la komerco se certaj anomalioj okazas.

Lernu pli pri la kurso.

fonto: www.habr.com

Aldoni komenton