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