InterSystems IRIS gagnagrunnskerfið styður áhugaverðar gagnageymsluuppbyggingar sem kallast alþjóðlegar lyklar. Þetta eru í raun margstiga lyklar með ýmsum viðbótareiginleikum eins og færslum, hraðvirkum aðgerðum til að fara í gegnum gagnatré, lásum og sérhannað ObjectScript tungumál.
Lestu meira um hnattrænar upplýsingar í greinaröðinni „Hnattrænar upplýsingar — sverð gagnageymslunnar“:
Ég fékk áhuga á því hvernig færslur eru útfærðar í alþjóðlegum töflum og hvaða sérkenni þær hafa. Þetta er jú allt önnur gagnageymsluuppbygging en kunnuglegar töflur. Þetta er á mun lægra stigi.
Eins og þekkt er úr kenningunni um tengslagagnagrunna, verður góð útfærsla færslna að uppfylla kröfurnar :
A — Atómeðlisfræði (atómeðlisfræði). Allar breytingar sem gerðar eru í viðskiptunum eru skráðar, eða engar.
C — Samræmi. Eftir að færsla er lokið verður rökfræðilegt ástand gagnagrunnsins að vera innra með sér. Þessi krafa varðar að mestu leyti forritarann, en í tilviki SQL gagnagrunna á hún einnig við um erlenda lykla.
Ég — Einangrun (isolate). Samtímis keyrðar færslur ættu ekki að hafa áhrif hver á aðra.
D — Endingargott. Eftir að færsla hefur verið lokið ættu vandamál á lægri stigum (t.d. rafmagnsleysi) ekki að hafa áhrif á gögnin sem færslan breytir.
Alþjóðlegar gagnagrindur eru gagnagrindur sem ekki tengjast. Þær voru hannaðar til að keyra afar hratt á mjög takmörkuðum vélbúnaði. Við skulum skoða hvernig við útfærum færslur í alþjóðlegum gagnagrindum með því að nota... .
Til að styðja við færslur í IRIS eru eftirfarandi skipanir notaðar: , , .
1. Atómleiki
Auðveldasta leiðin til að athuga atómleika er úr gagnagrunnsstjórnborðinu.
Kill ^a
TSTART
Set ^a(1) = 1
Set ^a(2) = 2
Set ^a(3) = 3
TCOMMITÞá drögum við niðurstöðu:
Write ^a(1), “ ”, ^a(2), “ ”, ^a(3)Við fáum:
1 2 3Allt er í lagi. Atómleiki er varðveittur: allar breytingar voru skrifaðar.
Við skulum flækja verkefnið, kynna villu og sjá hvernig færslan vistast, að hluta eða alls ekki.
Við skulum athuga atómleika aftur:
Kill ^A
TSTART
Set ^a(1) = 1
Set ^a(2) = 2
Set ^a(3) = 3Eftir það munum við stöðva gáminn af krafti, ræsa hann og sjá til.
docker kill my-irisÞessi skipun jafngildir næstum því nauðungarslökkvun, þar sem hún sendir SIGKILL merki til að stöðva ferlið tafarlaust.
Kannski var færslan að hluta til vistuð?
WRITE ^a(1), ^a(2), ^a(3)
^
<UNDEFINED> ^a(1)- Nei, það hefur ekki lifað af.
Við skulum prófa rollback skipunina:
Kill ^A
TSTART
Set ^a(1) = 1
Set ^a(2) = 2
Set ^a(3) = 3
TROLLBACK
WRITE ^a(1), ^a(2), ^a(3)
^
<UNDEFINED> ^a(1)Ekkert hefur heldur lifað af.
2. Samræmi
Þar sem í hnattrænum gagnagrunnum eru lyklar einnig búnir til á hnattrænum gögnum (munið að hnattrænt gagnagrunnur er gagnageymslubygging á lægra stigi en tengslatafla), til að uppfylla samræmiskröfuna, verður lykilbreytingin að vera innifalin í sömu færslu og hina hnattrænu breytingu.
Til dæmis höfum við alþjóðlega ^persónu þar sem við geymum persónuupplýsingar og notum TIN-númerið sem lykil.
^person(1234567, ‘firstname’) = ‘Sergey’
^person(1234567, ‘lastname’) = ‘Kamenev’
^person(1234567, ‘phone’) = ‘+74995555555
...Til að geta leitað fljótt eftir eftirnafni og fornafni bjuggum við til ^index lykilinn.
^index(‘Kamenev’, ‘Sergey’, 1234567) = 1Til þess að gagnagrunnurinn sé samræmdur verðum við að bæta við starfsfólki á eftirfarandi hátt:
TSTART
^person(1234567, ‘firstname’) = ‘Sergey’
^person(1234567, ‘lastname’) = ‘Kamenev’
^person(1234567, ‘phone’) = ‘+74995555555
^index(‘Kamenev’, ‘Sergey’, 1234567) = 1
TCOMMITÞar af leiðandi, þegar við eyðir, verðum við einnig að nota færslu:
TSTART
Kill ^person(1234567)
ZKill ^index(‘Kamenev’, ‘Sergey’, 1234567)
TCOMMITMeð öðrum orðum, ábyrgðin á að tryggja samræmi liggur alfarið hjá forritaranum. En þegar kemur að alþjóðlegum gildum er þetta eðlilegt vegna lágstigs eðlis þeirra.
3. Einangrun
Þetta er þar sem flækjustigið byrjar. Margir notendur vinna samtímis í sama gagnagrunninum og breyta sömu gögnunum.
Aðstæðurnar eru sambærilegar við það þegar margir notendur vinna með sama kóðageymsluna á sama tíma og reyna að gera breytingar á mörgum skrám í einu.
Gagnagrunnurinn verður að meðhöndla allt þetta í rauntíma. Í ljósi þess að alvarleg fyrirtæki hafa jafnvel sérstakan einstakling sem ber ábyrgð á útgáfustjórnun (sameiningu útibúa, lausn á árekstra o.s.frv.) og gagnagrunnurinn verður að meðhöndla allt þetta í rauntíma, verður flækjustig verkefnisins ljóst og mikilvægi þess að hanna gagnagrunninn og kóðann sem styður hann rétt.
Gagnagrunnurinn skilur ekki merkingu aðgerða sem notendur framkvæma til að koma í veg fyrir árekstra ef þeir vinna með sömu gögnin. Hann getur aðeins afturkallað eina færslu sem stangast á við aðra eða framkvæmt þær í röð.
Annað vandamál er að meðan á keyrslu færslu stendur (fyrir framkvæmd staðfestingar) getur staða gagnagrunnsins verið óstöðug, þannig að það er æskilegt að aðrar færslur hafi ekki aðgang að óstöðugu ástandi gagnagrunnsins, sem næst í tengslagagnagrunnum á marga vegu: með því að búa til skyndimyndir, fjölútgáfu raða o.s.frv.
Þegar færslur eru framkvæmdar samsíða er mikilvægt að þær trufli ekki hver aðra. Þetta er eiginleiki einangrunar.
SQL skilgreinir fjögur einangrunarstig:
- LESIÐ ÓSKULDBINDIÐ
- LESIÐ SKULDBINDIÐ
- ENDURTEKJANLEGT LESIÐ
- Raðhæft
Skoðum hvert stig fyrir sig. Kostnaðurinn við að innleiða hvert stig vex næstum veldishraða.
LESIÐ ÓSKULDBINDIÐ — Þetta er lægsta einangrunarstigið, en einnig það hraðasta. Færslur geta lesið breytingar hver annarrar.
LESIÐ SKULDBINDIÐ — Þetta er næsta einangrunarstig, sem er málamiðlun. Færslur geta ekki lesið breytingar hver annarrar fyrir framkvæmd, en þær geta lesið allar breytingar sem gerðar eru eftir framkvæmd.
Ef við höfum langtímafærslu T1, þar sem gerðar voru skuldbindingar í færslunum T2, T3 og Tn, sem unnu með sömu gögnum og T1, þá fáum við mismunandi niðurstöðu í hvert skipti þegar við leitum að gögnum í T1. Þetta fyrirbæri kallast óendurteknar lestrar.
ENDURTEKJANLEGT LESIÐ — Á þessu einangrunarstigi höfum við ekki fyrirbærið með óendurteknar lestrar, því fyrir hverja lesbeiðni er mynd af gögnunum búin til, og þegar þau eru endurnýtt í sömu færslu eru gögnin úr myndinni notuð. Hins vegar er hægt að lesa sýndargögn á þessu einangrunarstigi. Þetta vísar til þess að lesa nýjar raðir sem bætt var við með samtímis framkvæmdum færslum.
Raðhæft — hæsta stig einangrunar. Það einkennist af því að gögn sem notuð eru í færslu (lesin eða breytt) verða aðeins aðgengileg öðrum færslum eftir að fyrsta færslan er lokið.
Fyrst skulum við kanna hvort aðgerðirnar í færslunni eru einangraðar frá aðalþræðinum. Opnum tvo glugga í flugstöðinni.
Kill ^t
Write ^t(1)
2
TSTART
Set ^t(1)=2Það er engin einangrun. Einn þráður sér hvað hinn þráðurinn sem opnaði færsluna er að gera.
Við skulum sjá hvort færslur í mismunandi þráðum geti séð hvað er að gerast innan þeirra.
Opnum tvo glugga í flugstöðinni og opnum tvær færslur samtímis.
kill ^t
TSTART
Write ^t(1)
3
TSTART
Set ^t(1)=3
Samhliða færslur geta séð gögn hver annarrar. Þannig höfum við einfaldasta, en einnig hraðasta, einangrunarstigið: READ UNCOMMITTED.
Í meginatriðum mætti búast við þessu fyrir hnattræn fyrirtæki, þar sem afköst hafa alltaf verið í forgangi.
Hvað ef við þurfum meiri einangrun í alþjóðlegum starfsemi?
Hér þurfum við að hugsa um hvers vegna einangrunarstig eru yfirhöfuð nauðsynleg og hvernig þau virka.
Hæsta einangrunarstigið, SERIALIZE, þýðir að niðurstaða færslna sem framkvæmdar eru samsíða jafngildir raðbundinni framkvæmd þeirra, sem tryggir að ekki verði árekstrar.
Við getum gert þetta með hjálp hæfra læsinga í ObjectScript, sem hafa margar mismunandi leiðir til notkunar: þú getur framkvæmt reglulega, stigvaxandi og margfalda læsingu með skipuninni .
Lægri einangrunarstig eru málamiðlanir sem ætlaðar eru til að bæta afköst gagnagrunnsins.
Við skulum skoða hvernig við getum náð mismunandi stigum einangrunar með því að nota læsingar.
Þessi virki gerir þér kleift að taka ekki aðeins einkaréttar læsingar sem þarf til að breyta gögnum, heldur einnig svokallaða sameiginlega læsingu, sem nokkrir þræðir geta tekið samhliða þegar þeir þurfa að lesa gögn sem önnur ferli ættu ekki að breyta meðan á lestri stendur.
Lærðu meira um tvíþætta lokunaraðferðina á rússnesku og ensku:
→
→
Erfiðleikinn er sá að á meðan færslu stendur getur staða gagnagrunnsins verið ósamræmi, en þessi ósamræmi er sýnileg öðrum ferlum. Hvernig er hægt að forðast þetta?
Við munum nota læsingar til að búa til sýnileikaglugga þar sem staða gagnagrunnsins verður samræmd. Öllum aðgangi að þessum sýnileikagluggum verður stjórnað með læsingum.
Sameiginlegir læsingar á sömu gögnum eru endurnýtanlegar — margir ferlar geta aflað sér þeirra. Þessir læsingar koma í veg fyrir að aðrir ferlar breyti gögnunum, sem þýðir að þeir eru notaðir til að búa til glugga með samræmdu gagnagrunnsástandi.
Einkaréttarlásar eru notaðir til að breyta gögnum — aðeins eitt ferli getur fengið slíkan lás. Hægt er að fá einkaréttarlás með:
- Sérhvert ferli ef gögnin eru ókeypis
- Aðeins ferlið sem hefur sameiginlega lás á þessum gögnum og var fyrst til að biðja um einkaréttarlás.

Því þrengra sem sýnileikaglugginn er, því lengur þurfa aðrir ferlar að bíða eftir honum, en því samræmdari getur staða gagnagrunnsins verið innan hans.
LESIÐ_FRAMKVÆMT — Kjarninn í þessu stigi er sá að við sjáum aðeins gögn frá öðrum þráðum. Ef gögnin í annarri færslu hafa ekki enn verið send inn, sjáum við gömlu útgáfuna.
Þetta gerir okkur kleift að samsíða verkinu í stað þess að bíða eftir að læsingin losni.
Án einhverra sérstakra brella munum við ekki geta séð gömlu útgáfuna af gögnunum í IRIS, svo við verðum að láta okkur nægja læsingar.
Þar af leiðandi verðum við að nota sameiginlega lása til að leyfa aðeins gagnalestur þegar samræmi er til staðar.
Segjum sem svo að við höfum notendagrunn ^manneskju sem millifærir peninga hver á annan.
Þegar einstaklingur 123 fluttist yfir í einstakling 242:
LOCK +^person(123), +^person(242)
Set ^person(123, amount) = ^person(123, amount) - amount
Set ^person(242, amount) = ^person(242, amount) + amount
LOCK -^person(123), -^person(242)Þegar óskað er eftir fjárhæðinni frá einstaklingi 123 áður en hún er afskrifuð verður að fylgja einkaréttur (sjálfgefið):
LOCK +^person(123)
Write ^person(123)Ef þú þarft að birta stöðu reikningsins þíns á persónulega reikningnum þínum geturðu notað sameiginlega læsingu eða sleppt henni yfirleitt:
LOCK +^person(123)#”S”
Write ^person(123)Hins vegar, ef við gerum ráð fyrir að gagnagrunnsaðgerðir séu framkvæmdar nánast samstundis (leyfið mér að minna ykkur á að globals eru mun lægra stigs uppbygging en tengslatafla), þá minnkar þörfin fyrir þetta stig.
ENDURTEKJANLEGT LESIÐ — Þetta einangrunarstig gerir kleift að lesa gögn margoft sem hægt er að breyta með samtímis færslum.
Þar af leiðandi verðum við að setja sameiginlegan læsingu á lestri gagnanna sem við erum að breyta og einkalæsingar á gögnunum sem við erum að breyta.
Sem betur fer gerir LOCK virkjarinn þér kleift að lista í smáatriðum alla nauðsynlega læsingar, sem geta verið margir, í einum virkjara.
LOCK +^person(123, amount)#”S”
чтение ^person(123, amount)aðrar aðgerðir (eins og er reyna samsíða þræðir að breyta ^person(123, amount), en geta það ekki)
LOCK +^person(123, amount)
изменение ^person(123, amount)
LOCK -^person(123, amount)
чтение ^person(123, amount)
LOCK -^person(123, amount)#”S”Þegar læsingar eru taldar upp, aðskildar með kommum, eru þær teknar í réttri röð, og ef þú gerir þetta:
LOCK +(^person(123),^person(242))síðan eru þau tekin atómlega öll í einu.
Raðraða — Við verðum að setja upp læsingar þannig að allar færslur sem deila gögnum séu að lokum framkvæmdar í röð. Fyrir þessa aðferð ættu flestar læsingar að vera einkaréttar og notaðar á minnstu svæðum hnattrænnar gagnaöflunar vegna afkasta.
Ef við tölum um afskriftir fjármuna í ^person global, þá er aðeins einangrunarstigið SERIALIZE ásættanlegt fyrir það, þar sem peningar verða að vera eytt í ströngu röð, annars er mögulegt að eyða sömu upphæð nokkrum sinnum.
4. Ending
Ég framkvæmdi prófanir með hörðum skurði á ílátinu með því að nota
docker kill my-irisGrunnurinn þoldi þau vel. Engin vandamál komu upp.
Ályktun
InterSystems IRIS styður færslur fyrir alþjóðlegar gagnagrunna. Þær eru sannarlega atómlausar og áreiðanlegar. Að tryggja samræmi gagnagrunnsins við alþjóðlegar gagnagrunna krefst fyrirhafnar forritara og notkunar færslu, þar sem það skortir flóknar innbyggðar uppbyggingar eins og erlenda lykla.
Einangrunarstigið fyrir globals án þess að nota læsingar er READ UNCOMMITTED, og með læsingum er hægt að ná því allt að SERIALIZE stigi.
Réttmæti og hraði færslna á globalum kerfum er mjög háður færni forritarans: því meira sem sameiginlegir lásar eru notaðir til lestrar, því hærra er einangrunarstigið og því þrengra sem einkaréttarlásar eru notaðir, því meiri er afköstin.
Heimild: www.habr.com
