Transaktiounen an InterSystems IRIS globals

Transaktiounen an InterSystems IRIS globalsD'InterSystems IRIS DBMS ënnerstëtzt interessant Strukture fir Daten ze spÀicheren - globalen. Weesentlechen, dës sinn Multi-Niveau Schlësselen mat verschiddenen zousÀtzlech Goodies a Form vun Transaktiounen, séier Fonctiounen fir daten Beem, SpÀren a seng eege ObjectScript Sprooch.

Liest méi iwwer Globalen an der Serie vun Artikelen "Globals sinn Schatzschwerter fir Daten ze spÀicheren":

Beem. Deel 1
Beem. Deel 2
Spuer Arrays. Deel 3

Ech sinn interessĂ©iert wĂ©i Transaktiounen a Globalen Ă«mgesat ginn, wĂ©i eng Features et ginn. No allem ass dĂ«st eng komplett aner Struktur fir Daten ze spĂ€icheren wĂ©i dĂ©i ĂŒblech DĂ«scher. Vill mĂ©i nidderegen Niveau.

WĂ©i aus der Theorie vu relationalen Datenbanken bekannt ass, muss eng gutt Ëmsetzung vun Transaktiounen den Ufuerderunge erfĂ«llen sauerem:

A - Atom (AtomizitĂ©it). All Ännerungen an der Transaktioun gemaach oder guer keng ginn opgeholl.

C - Konsequenz. Nodeems eng Transaktioun ofgeschloss ass, muss de logesche Zoustand vun der Datebank intern konsequent sinn. A ville Weeër betrëfft dës Fuerderung de Programméierer, awer am Fall vun SQL Datenbanken betrëfft et och auslÀnnesch Schlësselen.

Ech - Isoléieren. Transaktiounen déi parallel lafen, sollten sech net beaflossen.

D - haltbar. No der erfollegrÀicher Ofschloss vun enger Transaktioun, Problemer op nidderegen Niveauen (Stromausfall, zum Beispill) dÀerfen d'Daten net beaflossen, déi vun der Transaktioun geÀnnert ginn.

Globale sinn net-relational Datestrukturen. Si goufen entwĂ©ckelt fir super sĂ©ier op ganz limitĂ©iert Hardware ze lafen. Loosst d'op d'Ëmsetzung vun Transaktiounen am globalen benotzen offiziell IRIS Docker Bild.

Fir Transaktiounen an IRIS z'ënnerstëtzen, ginn déi folgend Kommandoen benotzt: TSTART, TCOMMIT, TROLLBACK.

1. Atomitéit

Deen einfachste Wee fir ze kontrolléieren ass Atomitéit. Mir kontrolléieren aus der Datebank Konsol.

Kill ^a
TSTART
Set ^a(1) = 1
Set ^a(2) = 2
Set ^a(3) = 3
TCOMMIT

Dann schléissen mir:

Write ^a(1), “ ”, ^a(2), “ ”, ^a(3)

Mir kréien:

1 2 3

Alles ass gutt. AtomizitĂ©it gĂ«tt behalen: all Ännerungen ginn opgeholl.

Loosst eis d'Aufgab komplizéiere, e Feeler aféieren a kucken wéi d'Transaktioun gespuert gëtt, deelweis oder guer net.

Loosst eis d'Atomitéit nach eng Kéier iwwerpréiwen:

Kill ^A
TSTART
Set ^a(1) = 1
Set ^a(2) = 2
Set ^a(3) = 3

Da wÀerte mir de Container mat Kraaft ophalen, starten a kucken.

docker kill my-iris

Dëse Kommando ass bal glÀichwÀerteg mat enger Kraaftausschaltung, well et e SIGKILL Signal schéckt fir de Prozess direkt ze stoppen.

VlÀicht war d'Transaktioun deelweis gerett?

WRITE ^a(1), ^a(2), ^a(3)
^
<UNDEFINED> ^a(1)

- Nee, et ass net iwwerlieft.

Loosst eis de Rollback Kommando probéieren:

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)

Och huet nÀischt iwwerlieft.

2. Konsequenz

ZĂ«nter datt an Datenbanken basĂ©iert op Globalen, SchlĂ«sselen och op Globale gemaach ginn (loosst mech drun erĂ«nneren datt e Global eng Struktur op mĂ©i nidderegen Niveau ass fir Daten ze spĂ€icheren wĂ©i e relationalen DĂ«sch), fir d'Konsistenzfuerderung z'erreechen, muss eng Ännerung vum SchlĂ«ssel abegraff sinn. an der selwechter Transaktioun wĂ©i eng Ännerung am globale.

Zum Beispill hu mir eng global ^Persoun, an dÀr mir Perséinlechkeeten spÀicheren a mir den TIN als Schlëssel benotzen.

^person(1234567, ‘firstname’) = ‘Sergey’
^person(1234567, ‘lastname’) = ‘Kamenev’
^person(1234567, ‘phone’) = ‘+74995555555
...

Fir séier no Familljenumm a Virnumm ze sichen, hu mir den ^index Schlëssel gemaach.

^index(‘Kamenev’, ‘Sergey’, 1234567) = 1

Fir datt d'Datebank konsequent ass, musse mir d'Persoun esou addéieren:

TSTART
^person(1234567, ‘firstname’) = ‘Sergey’
^person(1234567, ‘lastname’) = ‘Kamenev’
^person(1234567, ‘phone’) = ‘+74995555555
^index(‘Kamenev’, ‘Sergey’, 1234567) = 1
TCOMMIT

Deementspriechend musse mir beim LĂ€schen och eng Transaktioun benotzen:

TSTART
Kill ^person(1234567)
ZKill ^index(‘Kamenev’, ‘Sergey’, 1234567)
TCOMMIT

An anere Wierder, d'Erfëllung vun der Konsistenzfuerderung hÀnkt ganz op de Schëllere vum Programméierer. Awer wann et ëm d'Global geet, ass dëst normal, wéinst hirer niddereger Natur.

3. Isolatioun

Dëst ass wou d'Wilds ufÀnken. Vill Benotzer schaffen glÀichzÀiteg un der selwechter Datebank, Ànneren déiselwecht Daten.

D'Situatioun ass verglĂ€ichbar wĂ©i wann vill Benotzer glĂ€ichzĂ€iteg mam selwechte Code Repository schaffen a probĂ©ieren glĂ€ichzĂ€iteg Ännerungen op vill Dateien glĂ€ichzĂ€iteg ze engagĂ©ieren.

D'Datebank soll alles an EchtzÀit sortéieren. Bedenkt datt an seriöse Firmen et souguer eng speziell Persoun ass, déi fir Versiounskontroll verantwortlech ass (fir Branchen ze fusionéieren, Konflikter ze léisen, asw.), an d'Datebank muss dat alles an EchtzÀit maachen, d'Komplexitéit vun der Aufgab an d'Korrektheet vun der Datebank Design a Code deen et déngt.

D'Datebank kann d'Bedeitung vun den Handlungen, déi d'Benotzer gemaach hunn, net verstoen fir Konflikter ze vermeiden wa se un déiselwecht Daten schaffen. Et kann nëmmen eng Transaktioun annuléieren, déi mat enger anerer Konflikt ass, oder se sequentiell ausféieren.

En anere Problem ass datt wÀhrend der Ausféierung vun enger Transaktioun (virun engem Engagement) den Zoustand vun der Datebank inkonsistent ka sinn, sou datt et wënschenswÀert ass datt aner Transaktiounen keen Zougang zum inkonsistenten Zoustand vun der Datebank hunn, wat a relationalen Datenbanken erreecht gëtt. op vill Manéiere: Snapshots erstellen, Multi-Versiounsreihen an asw.

Wann Dir Transaktiounen parallel ausféiert, ass et wichteg fir eis datt se net matenee stéieren. Dëst ass d'Besëtz vun der Isolatioun.

SQL definéiert 4 Isolatiounsniveauen:

  • VIRLIESEN UNZUELT
  • VIRLIESEN ENGAGÉIERT
  • REPEATABLE LEES
  • SERIALIZABLE

Loosst eis all Niveau separat kucken. D'KÀschte fir all Niveau ëmzesetzen wuessen bal exponentiell.

VIRLIESEN UNZUELT - dĂ«st ass den niddregsten Niveau vun Isolatioun, awer glĂ€ichzĂ€iteg de schnellsten. Transaktioune kĂ«nnen d'Ännerunge vunenee liesen.

VIRLIESEN ENGAGÉIERT ass den nĂ€chsten Niveau vun der Isolatioun, wat e Kompromiss ass. Transaktioune kĂ«nnen d'Ännerunge vuneneen net virum Engagement liesen, awer si kĂ«nnen all Ännerungen liesen, dĂ©i nom Engagement gemaach goufen.

Wa mir eng laang Transaktioun T1 hunn, wÀhrend deenen d'Verpflichtungen an Transaktiounen T2, T3 ... Tn stattfonnt hunn, déi mat de selwechten Donnéeën wéi T1 geschafft hunn, dann wann Dir Daten an T1 ufroen, wÀerte mir all Kéier en anert Resultat kréien. Dëst PhÀnomen gëtt net widderholl Liesen genannt.

REPEATABLE LEES - an dĂ«sem Isolatiounsniveau hu mir net de PhĂ€nomen vun net widderhuelend Liesen, wĂ©inst der Tatsaach datt fir all Ufro fir Daten ze liesen, e Snapshot vun de Resultatdaten erstallt gĂ«tt a wann se an der selwechter Transaktioun weiderbenotzt ginn, d'DonnĂ©eĂ«n aus dem Snapshot benotzt gĂ«tt. WĂ©i och Ă«mmer, et ass mĂ©iglech Phantomdaten op dĂ«sem Isolatiounsniveau ze liesen. DĂ«st bezitt sech op nei Zeilen ze liesen dĂ©i duerch parallel engagĂ©iert Transaktioune bĂ€igefĂŒĂŒgt goufen.

SERIALIZABLE - den hĂ©chsten Niveau vun Isolatioun. Et ass charakterisĂ©iert duerch d'Tatsaach datt d'DonnĂ©eĂ«n, dĂ©i op iergendeng ManĂ©ier an enger Transaktioun benotzt ginn (liesen oder Ă€nneren) fir aner Transaktiounen erĂ©ischt no der RĂ©alisatioun vun der Ă©ischter Transaktioun verfĂŒgbar sinn.

Als éischt, loosst eis erausfannen ob et Isolatioun vun Operatiounen an enger Transaktioun vum Haaptfuedem ass. Loosst eis 2 Terminalfenster opmaachen.

Kill ^t

Write ^t(1)
2

TSTART
Set ^t(1)=2

Et gëtt keng Isolatioun. Ee Fuedem gesÀit wat deen zweeten deen d'Transaktioun opgemaach huet mécht.

Loosst eis kucken ob Transaktioune vu verschiddene Threads gesinn wat an hinnen geschitt.

Loosst eis 2 Terminalfenster opmaachen an 2 Transaktiounen parallel opmaachen.

kill ^t
TSTART
Write ^t(1)
3

TSTART
Set ^t(1)=3

Parallel Transaktiounen gesinn all aner Daten. Also hu mir den einfachsten, awer och de schnellsten Isolatiounsniveau, VIRLIESEN UNCOMMITED.

Prinzipiell kann dat fir Globalen erwaart ginn, fir déi d'Leeschtung ëmmer eng Prioritéit war.

Wat wa mir e méi héijen Niveau vun Isolatioun an Operatiounen op Globale brauchen?

Hei musst Dir nodenken firwat Isolatiounsniveauen iwwerhaapt gebraucht ginn a wéi se funktionnéieren.

Den héchsten Isolatiounsniveau, SERIALIZE, bedeit datt d'Resultat vun Transaktiounen déi parallel ausgefouert ginn ass glÀichwÀerteg mat hirer sequentieller Ausféierung, wat d'Feele vu Kollisiounen garantéiert.

Mir kënnen dëst mat Smart SpÀren am ObjectScript maachen, déi vill verschidde Gebrauch hunn: Dir kënnt regelméisseg, inkrementell, multiple Sperre mam Kommando maachen gespaarten.

Méi niddereg Isolatiounsniveauen sinn Ofhandlungen entwéckelt fir d'Datebankgeschwindegkeet ze erhéijen.

Loosst eis kucken wéi mir verschidde Isolatiounsniveauen mat Schleisen erreechen kënnen.

Dëse Bedreiwer erlaabt Iech net nëmmen exklusiv SpÀren ze huelen, déi néideg sinn fir Daten z'Ànneren, awer sougenannte gemeinsame SpÀren, déi e puer Threads parallel huelen kënnen, wann se Donnéeën liesen mussen, déi net vun anere Prozesser wÀhrend dem Liesprozess geÀnnert ginn.

Méi Informatioun iwwer d'Zwee-Phase Blockéierungsmethod op Russesch an Englesch:

→ Zwee-Phase BlockĂ©ierung
→ Zwee-Phase Sperrung

D'Schwieregkeet ass datt wÀhrend enger Transaktioun den Zoustand vun der Datebank inkonsistent ka sinn, awer dës inkonsistent Donnéeën si fir aner Prozesser sichtbar. Wéi dëst ze vermeiden?

Mat SpÀren erstellen mir Visibilitéitsfenster an deenen den Zoustand vun der Datebank konsequent ass. An all Zougang zu esou Fënstere vun Visibilitéit vun der ausgemaach Staat gëtt vun Schleisen kontrolléiert ginn.

Gedeelt SpÀren op déiselwecht Donnéeën sinn erëmbenotbar - verschidde Prozesser kënnen se huelen. Dës SpÀren verhënneren datt aner Prozesser Daten Ànneren, d.h. si gi benotzt fir Fënstere vu konsequenten Datebankstaat ze bilden.

Exklusiv SpÀre gi fir DatenÀnnerungen benotzt - nëmmen ee Prozess kann esou e SpÀr huelen. En exklusive Schloss kann geholl ginn duerch:

  1. All Prozess wann d'Donnéeën gratis ass
  2. Nëmmen de Prozess deen e gemeinsame SpÀr op dës Donnéeën huet a war déi éischt fir en exklusive SpÀr ze froen.

Transaktiounen an InterSystems IRIS globals

Wat d'Visibilitéitsfenster méi schmuel ass, dest méi laang musse aner Prozesser drop waarden, awer wat méi konsequent den Zoustand vun der Datebank dran ka sinn.

VIRLIESEN_COMMITTED - d'Essenz vun dësem Niveau ass datt mir nëmmen engagéiert Donnéeën vun anere Threads gesinn. Wann d'Donnéeën an enger anerer Transaktioun nach net engagéiert sinn, da gesi mir seng al Versioun.

Dëst erlaabt eis d'Aarbecht parallel zu engem waarden op d'SpÀr verëffentlecht ginn.

Ouni speziell Tricken wÀerte mir déi al Versioun vun den Donnéeën net an IRIS gesinn, also musse mir mat SpÀren maachen.

Deementspriechend musse mir gemeinsame SpÀren benotzen fir datt d'Donnéeën nëmmen a Momenter vu Konsistenz gelies kënne ginn.

Loosst eis soen, mir hunn eng Benotzerbasis ^Persoun déi Sue mateneen iwwerweist.

Moment vum Transfert vu Persoun 123 op Persoun 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)

De Moment vun der Ufro vun der Quantitéit u Sue vun der Persoun 123 virum Débit muss vun engem exklusive Block begleet ginn (par défaut):

LOCK +^person(123)
Write ^person(123)

A wann Dir de Kontstatus an Ärem persĂ©inleche Kont muss weisen, da kĂ«nnt Dir e gemeinsame SpĂ€r benotzen oder guer net benotzen:

LOCK +^person(123)#”S”
Write ^person(123)

Wéi och ëmmer, wa mir unhuelen datt d'Datebankoperatioune bal direkt ausgefouert ginn (loosst mech drun erënneren datt d'Globaler eng vill méi niddereg-Niveau Struktur sinn wéi e relationalen Dësch), da fÀllt de Besoin fir dësen Niveau erof.

REPEATABLE LEES - Dësen Isolatiounsniveau erlaabt verschidde Liesungen vun Daten, déi duerch glÀichzÀiteg Transaktioune geÀnnert kënne ginn.

Deementspriechend musse mir e gemeinsame SpÀr setzen fir d'Donnéeën ze liesen déi mir Ànneren an exklusiv SpÀren op d'Donnéeën déi mir Ànneren.

Glécklecherweis erlaabt de LOCK Bedreiwer Iech all déi néideg SpÀren am Detail ze lëschten, vun deenen et vill ka sinn, an enger Ausso.

LOCK +^person(123, amount)#”S”
Ń‡Ń‚Đ”ĐœĐžĐ” ^person(123, amount)

aner Operatiounen (zu dëser ZÀit probéieren parallel Threads ^Persoun ze Ànneren (123, Betrag), awer kënnen net)

LOCK +^person(123, amount)
ĐžĐ·ĐŒĐ”ĐœĐ”ĐœĐžĐ” ^person(123, amount)
LOCK -^person(123, amount)

Ń‡Ń‚Đ”ĐœĐžĐ” ^person(123, amount)
LOCK -^person(123, amount)#”S”

Wann Dir d'SchlÀsser opgelëscht mat Kommaen getrennt, gi se sequentiell geholl, awer wann Dir dëst maacht:

LOCK +(^person(123),^person(242))

da ginn se atomesch all op eemol geholl.

SERIALISEREN - Mir mussen SpÀren setzen sou datt schlussendlech all Transaktiounen déi gemeinsam Donnéeën hunn sequentiell ausgefouert ginn. Fir dës Approche, soll déi meescht SpÀr exklusiv an geholl op de klengste BerÀicher vun der globaler fir Leeschtung.

Wa mir iwwer d'Debitéiere vu Fongen an der globaler ^Persoun schwÀtzen, dann ass nëmmen den SERIALIZE Isolatiounsniveau dofir akzeptabel, well d'Suen strikt sequentiell ausginn musse ginn, soss ass et méiglech deeselwechte Betrag e puer Mol ze verbréngen.

4. Haltbarkeet

Ech hunn Tester gemaach mat hart Ausschneiden vum Container benotzt

docker kill my-iris

D'Basis huet se gutt toleréiert. Keng Problemer goufen identifizéiert.

Konklusioun

Fir Globale huet InterSystems IRIS Transaktiounssupport. Si si wierklech atomar an zouverlÀsseg. Fir d'Konsistenz vun enger Datebank op Globalen ze garantéieren, sinn Programméierer Efforten an d'Benotzung vun Transaktiounen erfuerderlech, well et keng komplex agebaute Konstruktiounen wéi auslÀnnesch Schlësselen huet.

D'Isolatiounsniveau vu Globalen ouni SpÀren ze benotzen ass VIRLIESEN UNCOMMITED, a wann Dir SpÀre benotzt, kann et bis zum SERIALIZE Niveau geséchert ginn.

D'Korrektheet an d'Geschwindegkeet vun Transaktiounen op Globale hÀnkt ganz vun der FÀegkeet vum Programméierer of: wat méi verbreet gedeelt SpÀren beim Liesen benotzt ginn, wat méi héich ass den Niveau vun der Isolatioun, an wat méi schmuel exklusiv SpÀren geholl ginn, wat méi séier d'Leeschtung.

Source: will.com

Setzt e Commentaire